home *** CD-ROM | disk | FTP | other *** search
/ PC Media 22 / PC MEDIA CD22.iso / share / prog / xyz100s / xyz100.doc < prev   
Text File  |  1995-09-23  |  149KB  |  3,259 lines

  1. ╔═════════════════════════════════════════════════════════════════════╗
  2. ║ System requirements                                                 ║
  3. ╚═════════════════════════════════════════════════════════════════════╝
  4.  To run XYZ you will need to meet the following requirements:
  5.     1. An 80286 or above IBM compatible computer
  6.     2. DOS version 3.3 or above
  7.     3. A minimum 128k of free dos memory
  8. ╔═════════════════════════════════════════════════════════════════════╗
  9. ║ Advantages of XYZ                                                   ║
  10. ╚═════════════════════════════════════════════════════════════════════╝
  11.  1. XYZ is very easy to read and write...no programming degree needed!
  12.  2. XYZ compiles to a very small code size.
  13.  3. XYZ is inexpensive.
  14.  4. XYZ makes fast programs.
  15.  5. The XYZ math functions have a variable number of digits...from 9 
  16.     to 53 digits in length!
  17. ╔═════════════════════════════════════════════════════════════════════╗
  18. ║ Disadvantages of XYZ                                                ║
  19. ╚═════════════════════════════════════════════════════════════════════╝
  20.  1. XYZ is limited to 111 characters per line in the source file.
  21.  2. This version of XYZ is limited to COM files of less than 64k bytes
  22.     in size.
  23.  3. The shareware version of XYZ is limited to 40 lines of code.
  24. ╔═════════════════════════════════════════════════════════════════════╗
  25. ║ Theory behind XYZ                                                   ║
  26. ╚═════════════════════════════════════════════════════════════════════╝
  27.  The purpose behind the  creation of XYZ was  to enable anyone to  sit
  28.  down  and  write  their  own  software  or create their own utilities
  29.  without having to have a degree in programming to do it.  I have seen
  30.  the cryptic code that even  languages as simple as BASIC  and FORTRAN
  31.  have and I thought..."there must be a better way.". 
  32.  
  33.  There is  a revolution  of technology  taking place  in the  computer
  34.  industry  today  but  unfortunately,  there  isn't  a   corresponding
  35.  revolution  taking  place  in  human  nature  as  far  as  quality is
  36.  concerned.  I don't know about  you but I'm tired of being  forced to
  37.  decide  between  the  lesser  of  two  evils  when it comes to buying
  38.  software. I want to help change that.  That is why I decided to  make
  39.  this software compiler  available. Now you  or I can  decide how much
  40.  quality goes into our software and what features we want with it  and
  41.  all we have to do is just spend a little time to write it ourselves.
  42.  
  43.  Please just take a  few moments to look  at this software and  see if
  44.  this is  what you've  been looking  for too.   If you  don't like it,
  45.  that's OK, but please, send me a line and let me know what you  think
  46.  could be done to make it better.
  47.  
  48.  To accomplish my goal of a simple compiler, I designed XYZ with these
  49.  goals in mind:
  50.  
  51.    1. Simple to read and simple to write.
  52.    2. XYZ uses mostly three letter commands. This is because  research
  53.       has shown  that three  letter words  are the  easiest words  for
  54.      people to remember.  By placing all  commands as the  first word
  55.      of each line,  it is also  easier to scan  for certain words  or
  56.      catch mistakes in typing.
  57.    3. XYZ  cannot  use  weird,  hard  to  remember  syntax, symbols or
  58.       reserved arguments.
  59.  
  60.  But no matter how simple programming is made, programming will always
  61.  require a  person to  have strong  logical thinking  abilities.   XYZ
  62.  cannot  teach  you  how  to  think  better  logically, but if you are
  63.  already a  good logical  thinker, it  can help  you put  your logical
  64.  thoughts into computer code easier.  XYZ wasn't made with the thought
  65.  of making programming simpler at  the cost of losing power  over your
  66.  computer  environment  either.  It  has  to  be simple enough for the
  67.  casual   user  as  well  as  powerful  enough  for  the   experienced
  68.  programmer to use.
  69. ╔═════════════════════════════════════════════════════════════════════╗
  70. ║ XYZ License Agreement                                               ║
  71. ╚═════════════════════════════════════════════════════════════════════╝
  72.  XYZ is copyright material owned  by Andrew Robinson and is  protected
  73.  by United States copyright laws and international treaty provisions.
  74.  
  75.  THIS IS A LEGAL AGREEMENT BETWEEN ALL USERS OF ALL VERSIONS OF XYZ:
  76.  
  77.  XYZ is provided as a  shareware program. This entitles one  person on
  78.  one computer  to use  and evaluate  this product  for a  period of 30
  79.  days. Only the shareware version of XYZ is freely distributable.
  80.  
  81.  Should you decide not to register this product, then all source  code
  82.  and/or executable  software/firmware derived  from this  XYZ software
  83.  application product will remain as the legal property of the owner of
  84.  the XYZ software application product.
  85.  
  86.  If you decide to become a registered user, then the owner of the  XYZ
  87.  software  application   product  will   grant  you   a  non-exclusive
  88.  royalty-free  right  to  publish  your  source  code  and  executable
  89.  software PROVIDED that you:
  90.    1. Do  not use  the XYZ  name, logo,  or trademark  to market  your
  91.       software application product.
  92.    2. Agree to indemnify, hold  harmless, and defend the owner  of the
  93.       XYZ software  application product  from and  against any  claims
  94.      or lawsuits  (including attorney's  fees) that  arise or  result
  95.       from  the  use  of  distribution  of  your  software application
  96.      product.
  97.    3. Do not publish any part or whole of the XYZ software application
  98.       product as firmware.
  99.    4. Agree to publish your  name and/or registration number with  the
  100.       source code to your software application product (if the  source
  101.      code is published).   It is your  responsibility to ensure  that
  102.      your name  and/or registration  number remain  intact with  your
  103.      software application product during distribution.
  104.    5. Agree to use only the  registered version of XYZ to derive  your
  105.       software application product.
  106.  
  107.  Registering the  XYZ software  application product  will entitle  one
  108.  person on one computer to use this product per registration.  You may
  109.  not rent or lease the registered XYZ software application product  to
  110.  anyone. You may not transfer  ownership of the registration. You  may
  111.  make  one  copy  of  the  registered XYZ software application product
  112.  solely for the purpose of backup or archiving.
  113.  
  114.  You  may  not  reverse  engineer,  decompile,  disassemble,  or  make
  115.  derivatives of any version of the XYZ software application product.
  116. ╔═════════════════════════════════════════════════════════════════════╗
  117. ║ XYZ Limited Warranty                                                ║
  118. ╚═════════════════════════════════════════════════════════════════════╝
  119.  The unregistered version of  the XYZ software application  product is
  120.  provided "as is", without warranty of any kind.
  121.  
  122.  All warranties (including any implied warranties) for the  registered
  123.  version of the XYZ software  application product are for a  period of
  124.  ninety (90) days from  the date of receipt  of registration.  XYZ  is
  125.  warranted to perform substantially in accordance with the accompanied
  126.  written  or  archived  material  distributed  with  the  XYZ software
  127.  application product.
  128.  
  129.  To  the  maximum  extent  permitted  by  the  law,  the  owner of XYZ
  130.  disclaims  all  other  expressed  or  implied  warranties   including
  131.  warranties  implying  merchanability  and  fitness  for  a particular
  132.  purpose.
  133.  
  134.  To the maximum  extent permitted by  the law, in  no event shall  the
  135.  owner of XYZ be liable for any damages whatsoever (including  without
  136.  limitation, damages  for loss  of business  profits, interruption  of
  137.  business, loss of business information, or any other pecuniary  loss)
  138.  arising out of the use of  or inability to use this product,  even if
  139.  the owner of XYZ has been advised of the possibility of such damages.
  140.  
  141.  Some limitations  discussed here  may not  apply to  you depending on
  142.  your local state or jurisdiction rulings on these matters.
  143. ╔═════════════════════════════════════════════════════════════════════╗
  144. ║ TABLE OF CONTENTS:                                                  ║
  145. ╚═════════════════════════════════════════════════════════════════════╝
  146.  
  147.  CHAPTER TITLE:                                                 LINE#:
  148.  
  149.  System requirements ...........................................0001
  150.  Advantages of XYZ                                              0008
  151.  Disadvantages of XYZ ..........................................0017
  152.  Theory behind XYZ                                              0024
  153.  XYZ License Agreement .........................................0069
  154.  XYZ Limited Warranty                                           0116
  155.  TABLE OF CONTENTS: ............................................0143
  156.  Definition of ARGUMENT TYPES:                                  0326
  157.    NUMERIC argument types ......................................0345
  158.    TEXT argument types                                          0377
  159.    RESERVED argument types .....................................0388
  160.  Description of program commands:                               0471
  161.    /// (and adding comments)....................................0482
  162.    ---                                                          0542
  163.    abs .........................................................0561
  164.    acos                                                         0593
  165.    acosh .......................................................0593
  166.    add                                                          0566
  167.    and .........................................................0570
  168.    asin                                                         0593
  169.    asinh .......................................................0593
  170.    atan                                                         0593
  171.    atanh .......................................................0593
  172.    call                                                         0616
  173.    cmp .........................................................0648
  174.    convert                                                      0708
  175.    cos .........................................................0728
  176.    cosh                                                         0728
  177.    dat .........................................................0743
  178.    dec                                                          0836
  179.    div .........................................................0840
  180.    draw ellipse                                                 0845
  181.    draw line ...................................................0845
  182.    draw rotated ellipse                                         0845
  183.    end .........................................................0905
  184.    exp                                                          0914
  185.    ext .........................................................0919
  186.    file                                                         0943
  187.    find ........................................................1047
  188.    goto                                                         1070
  189.    inc .........................................................1075
  190.    input                                                        1079
  191.    int .........................................................1101
  192.    ior                                                          1128
  193.    jeq .........................................................1150
  194.    jer                                                          1160
  195.    jge .........................................................1170
  196.    jgt                                                          1180
  197.    jle .........................................................1190
  198.    jlt                                                          1200
  199.    jne .........................................................1210
  200.    len                                                          1220
  201.    log .........................................................1227
  202.    mouse                                                        1232
  203.    mul .........................................................1309
  204.    neg                                                          1314
  205.    plot ........................................................1318
  206.    pop                                                          1400
  207.    prn .........................................................1338
  208.    push                                                         1400
  209.    read ........................................................1391
  210.    ret                                                          1416
  211.    save ........................................................1421
  212.    scr                                                          1447
  213.    set .........................................................1463
  214.    sin                                                          0725
  215.    sinh ........................................................0725
  216.    slm                                                          1640
  217.    snd .........................................................1653
  218.    sub                                                          1672
  219.    tan .........................................................0733
  220.    tanh                                                         0733
  221.    tty .........................................................1680
  222.    wait                                                         1689
  223.    xor .........................................................1697
  224.  XYZ COMPILE TIME ERROR MESSAGES:                               1723
  225.  Reporting bugs or giving advice ...............................1754
  226.  Sample programs to compile                                     1785
  227.  Becoming a registered user ....................................1918
  228.  APPENDIX:                                                      1947
  229.    Table of key codes: .........................................1950
  230.    Table of video modes and their default colors:               1993
  231.    Table of ASCII codes: .......................................2049
  232.    List of some common DOS 21h interrupts:                      2096
  233.      Auxiliary Input ...........................................2099
  234.      Auxiliary Output                                           2103
  235.      Character Input with Buffer ...............................2107
  236.      Character Input without buffer                             2111
  237.      Character Input with Echo .................................2122
  238.      Character Input without Echo (unfiltered)                  2126
  239.      Character Input without Echo ..............................2130
  240.      Character Output                                           2134
  241.      Character string, Output ..................................2138
  242.      Check Input Status                                         2142
  243.      Create New Program Segment Prefix (PSP) ...................2147
  244.      Direct Console I/O                                         2151
  245.      Disk, Get allocation information about ....................2161
  246.      Disk, Get current                                          2171
  247.      Disk, Get data on .........................................2175
  248.      Disk, Read sector from (ignoring logical structure)        2183
  249.      Disk, Reset ...............................................2197
  250.      Disk, Select                                               2200
  251.      Disk, Write Sector to (ignoring logical structure) ........2205
  252.      Duplicate Handle                                           2219
  253.      Execute Program ...........................................2229
  254.      File directory, Create                                     2239
  255.      File directory, Delete ....................................2247
  256.      File directory, Find First File in                         2255
  257.      File directory, Find Next File in .........................2278
  258.      File directory, Get current                                2295
  259.      File directory, Set current ...............................2306
  260.      File, Close                                                2314
  261.      File, Commit (forces buffer to be written out) ............2322
  262.      File, Create                                               2330
  263.      File, Create Temporary ....................................2346
  264.      File, Create new                                           2362
  265.      File, Delete ..............................................2378
  266.      File, Extended open, create, or replace                    2386
  267.      File, Get or Set Attributes of ............................2433
  268.      File, Get or Set Date and Time of                          2449
  269.      File, Lock or unlock region of ............................2471
  270.      File, Open                                                 2486
  271.      File, Rename ..............................................2509
  272.      File, Set Handle Count (sets maximum number of files)      2518
  273.      File, Set location of pointer in ..........................2526
  274.      File or Device, Read from                                  2541
  275.      File or Device, Write to ..................................2553
  276.      Get Data Transfer Area (DTA) Address                       2565
  277.      Get Date ..................................................2569
  278.      Get Extended Country Information                           2576
  279.      Get Extended Error Information ............................2591
  280.      Get Interrupt Vector                                       2634
  281.      Get DOS Version Number ....................................2639
  282.      Get Program Segment Prefix (PSP) Address                   2644
  283.      Get Return Code ...........................................2648
  284.      Get Time                                                   2659
  285.      Get Verify Flag ...........................................2666
  286.      Get address of InDOS Flag                                  2671
  287.      Get or Set Allocation Strategy ............................2675
  288.      Get or Set Break Flag                                      2692
  289.      Get or Set Code Page ......................................2699
  290.      Get or Set Country Information                             2713
  291.      IOCTL (Input/Output Control): .............................2765
  292.        Get Device Information                                   2766
  293.        Change Sharing Retry Count ..............................2795
  294.        Check Input Status                                       2804
  295.        Check Output Status .....................................2819
  296.        Check if Block Device is Remote                          2831
  297.        Check if Block Device is Removable ......................2842
  298.        Check if Handle is Remote                                2851
  299.        Generic I/O Control for Block Devices ...................2863
  300.        Generic I/O Control for Character Devices                2885
  301.        Get Logical Drive Map ...................................2911
  302.        Read Control Data from Block Device Driver               2924
  303.        Read Control Data from Character Device Driver ..........2935
  304.        Set Device Information                                   2946
  305.        Set Logical Drive Map ...................................2964
  306.        Write Control Data to Block Device Driver                2977
  307.        Write Control Data to Character Device Driver ...........2988
  308.      Memory, Allocate Block                                     3000
  309.      Memory, Release Block .....................................3011
  310.      Memory, Resize Block                                       3019
  311.      Multiplex Interrupt .......................................3028
  312.      Printer Output                                             3037
  313.      Redirect Handle ...........................................3042
  314.      Set Data Transfer Area (DTA) Address                       3048
  315.      Set Date ..................................................3052
  316.      Set Extended Error Information                             3060
  317.      Set Interrupt Vector ......................................3065
  318.      Set Program Segment Prefix (PSP) Address                   3070
  319.      Set Time ..................................................3074
  320.      Set Verify Flag                                            3083
  321.      Terminate Program .........................................3086
  322.      Terminate Program with Return Code                         3090
  323.      Terminate and stay resident (TSR) .........................3094
  324.  List of DOS Extended Error Codes                               3098
  325.  Using the XYZ Critical Error Handler ..........................3178
  326. ╔═════════════════════════════════════════════════════════════════════╗
  327. ║ Definition of ARGUMENT TYPES:                                       ║
  328. ╚═════════════════════════════════════════════════════════════════════╝
  329.  First, let's discuss what exactly  is an argument. Most XYZ  commands
  330.  consist of  a three  letter word  followed by  a space. The arguments
  331.  are  the  variables  that  follow  each  command. For example, if the
  332.  command  is  an  add  instruction,  then  add will be followed by two
  333.  arguments that  will be  added together.   But every  command  cannot
  334.  deal with the same  arguments as every other  command can.  The  data
  335.  stored in a numeric argument is not the same as the data stored in  a
  336.  text argument. The computer can't tell them apart unless you tell  it
  337.  by  defining  your  arguments.  That  is  why we must define argument
  338.  types when programming on computers.  All XYZ argument names can  use
  339.  any letter  or symbol  in their  name except  for a  space (The space
  340.  indicates the  end of  a name).   The maximum  length of  the name is
  341.  thirty  characters.  Once  defined  as  either  a  numeric  or   text
  342.  variable, that same name cannot be  used again.  XYZ has three  basic
  343.  argument types defined for it:  NUMERIC, TEXT, and RESERVED  argument
  344.  types.
  345. ┌─────────────────────────────────────────────────────────────────────┐
  346. │ NUMERIC argument types...                                           │
  347. └─────────────────────────────────────────────────────────────────────┘
  348.  store numbers whose number of significant digits is predefined at the
  349.  first line of  every XYZ text  file with a  three digit number.  This
  350.  number may range from 009 digits to 053 digits. Each numeric argument
  351.  thereafter will take up the  same amount of significant digits.  Some
  352.  examples of a numeric argument name would be:
  353.  
  354.   NUMBER1
  355.   number2
  356.   MAGNETOHYDRODYNAMICS
  357.   GIV-ME.2(OF_THEM)!
  358.   ETC...
  359.   Paid$
  360.  
  361.  Every  numeric  argument  name  must  be  entered in the same format.
  362.  The format is (in this order only):
  363.   1. Give the sign of the number..."-" for negative numbers or nothing
  364.      for positive numbers.
  365.   2. Type the number (and the decimal place wherever it is needed).
  366.   3. Type a small e if you want to enter an exponent in the number.
  367.   4. Give  the sign  of  the  exponent..."-"  for negative  numbers or
  368.      nothing for  positive numbers.   The exponent  cannot be  greater
  369.      than 32767 or smaller than -32767.
  370.  
  371.  Some examples of  how you could  type a number  to be entered  into a
  372.  numeric variable would be:
  373.  
  374.   dat num Paid$=-1.2345e-245
  375.   dat num Paid$=135.7e24
  376.   dat num Paid$=5
  377. ┌─────────────────────────────────────────────────────────────────────┐
  378. │ TEXT argument types...                                              │
  379. └─────────────────────────────────────────────────────────────────────┘
  380.  stores text strings and must be predefined by the command "dat  txt".
  381.  Some examples of a text argument name would be:
  382.  
  383.   NUMBER1
  384.   WHAT!?...
  385.   number2
  386.   1forthe$money$
  387.   2fortheshow
  388. ┌─────────────────────────────────────────────────────────────────────┐
  389. │ RESERVED argument types...                                          │
  390. └─────────────────────────────────────────────────────────────────────┘
  391.  are  already  predefined  by  XYZ.   Using  these  argument types for
  392.  anything else other then their intended use can result in errors. The
  393.  following is a listing of all reserved variables used by XYZ:
  394.  
  395.   The numeric argument: result
  396.   The text argument:    buffer
  397.   The symbols = and *
  398.   These special numeric arguments:
  399.     angle
  400.     blank
  401.     char
  402.     col
  403.     col2
  404.     color
  405.     color2
  406.     dash1
  407.     dash2
  408.     error
  409.     freq
  410.     handle
  411.     hite
  412.     lptn
  413.     mode
  414.     mouse
  415.     row
  416.     row2
  417.     size
  418.     start
  419.     start2
  420.     usr1
  421.     usr2
  422.     usr3
  423.     wide
  424.     xmin
  425.     xmax
  426.     ymin
  427.     ymax
  428.   These special words:
  429.     videomode
  430.     tty
  431.  
  432.  All of the special numeric arguments have been predefined as  numeric
  433.  arguments  for  different  XYZ  commands.  The range of these numeric
  434.  arguments is from  0 to 65535  except for the  word color and  color2
  435.  which has a range  of 0 to 16,777,215.  When used as text  arguments,
  436.  all special arguments will accept only one letter of text.
  437.  
  438.  The two special words listed  above (videomode and tty) are  commands
  439.  to be used with the "set" command.
  440.  
  441.  The numeric variable "result" has a special place in XYZ.  It is  the
  442.  place  where  all  of  the  math  commands  store the result of their
  443.  calculations.  "Result"  must  always  be  the first numeric argument
  444.  following the command (except for "sub").
  445.  
  446.  For example:
  447.  
  448.    add Male and Female
  449.  
  450.  adds the  number of  Males to  the number  of Females  and places the
  451.  result of this calculation in the reserved numeric argument  "result"
  452.  for later retrieval by another command like the following example:
  453.  
  454.    add Male and Female
  455.    div result by Children
  456.  
  457.  which adds  the number  of Males  to the  number of  Females and then
  458.  divides the resulting number by the number of Children.  Notice  that
  459.  the  sub  command  is  the  only  command  in which the first numeric
  460.  argument appears second  so that proper  use of the  sub command when
  461.  using the reserved variable "result" would be:
  462.  
  463.    sub Children from result
  464.  
  465.  The text argument "buffer" is  another case of a special  variable in
  466.  the  XYZ  language.  It  is  a  predefined  text argument that is 300
  467.  characters  in  length.  When  your  XYZ  program  is first run, this
  468.  argument is filled up with the  contents of the command line for  the
  469.  firsts  128  characters  and  gibberish  for  the  rest  of  the text
  470.  argument.
  471. ╔═════════════════════════════════════════════════════════════════════╗
  472. ║ Description of program commands:                                    ║
  473. ╚═════════════════════════════════════════════════════════════════════╝
  474.  Remember...all of the XYZ commands are case sensitive so that if  any
  475.  commands are typed into  a XYZ program other  than the way they  have
  476.  been described  below, they  won't be  recognized as  legal commands.
  477.  Also  each  command  is  three  letters  followed  by  one space. The
  478.  following pages are a listing of each command used by XYZ along  with
  479.  the type and number  of arguments needed for  each command.  A  short
  480.  description is  given of  the use  of each  command and finally, each
  481.  description is followed by an example of that command if needed.
  482. ┌─────────────────────────────────────────────────────────────────────┐
  483. │ /// and adding comments                                             │
  484. └─────────────────────────────────────────────────────────────────────┘
  485.  Since XYZ is such a simple language to write, there is plenty of room
  486.  leftover for typing comments. Comments  can be added right after  the
  487.  last argument of a command (after the space). Comments can make a big
  488.  difference on how  readable your code  is to someone  else because it
  489.  can  be  used  to  explain  the  logic  you  used or to document some
  490.  function without the  reader having to  look it up.   It can also  be
  491.  used to show the routing of  jump commands.  For example, taking  the
  492.  small routine from the mouse command example...
  493.  
  494.    set mouse=0
  495.    mouse button
  496.    jeq LeftButtonPressed
  497.    jne LeftButtonNotPressed
  498.    --- LeftButtonPressed
  499.    mouse cursor=Newcursor
  500.    --- LeftButtonNotPressed
  501.    end with 0
  502.  
  503.  I can add comments to explain what I'm trying to do...
  504.  
  505.    set mouse=0 will check the status of the left...
  506.    mouse button ...when it was last pressed.
  507.    jeq LeftButtonPressed
  508.    jne LeftButtonNotPressed
  509.    --- LeftButtonPressed
  510.    mouse cursor=Newcursor will change the cursor.
  511.    --- LeftButtonNotPressed
  512.    end with 0
  513.  
  514.  Better yet, I can show the  results of each jump, making the  program
  515.  even more readable...
  516.  
  517.    set mouse=0 will check the status of the left...
  518.    mouse button ...when it was last pressed.
  519.    jeq LeftButtonPressed ──────────────────────────┐
  520.    jne LeftButtonNotPressed ─────────────────────┐ │
  521.    --- LeftButtonPressed ────────────────────────│─┘
  522.    mouse cursor NewCursor will change the cursor. │
  523.    --- LeftButtonNotPressed ─────────────────────┘
  524.    end with 0
  525.  
  526.  Finally, the characters "/// " are reserved  as a comment  line. This
  527.  can enable me to separate the program into sections like this...
  528.  
  529.    set mouse=0 will check the status of the left...
  530.    mouse button ...when it was last pressed.
  531.    jeq LeftButtonPressed ──────────────────────────┐
  532.    jne LeftButtonNotPressed ─────────────────────┐ │
  533.    /// If the left mouse button was pressed:      │ │
  534.    --- LeftButtonPressed ────────────────────────│─┘
  535.    mouse cursor=NewCursor will change the cursor. │
  536.    /// Either way we'll end up here anyways...    │
  537.    --- LeftButtonNotPressed ─────────────────────┘
  538.    end with 0
  539.  
  540.  Use your own imagination to come up with even more ways to make  your
  541.  program even more readable then this one.
  542. ┌─────────────────────────────────────────────────────────────────────┐
  543. │ --- LABEL                                                           │
  544. └─────────────────────────────────────────────────────────────────────┘
  545.  The ---  command is  where one  part of  a XYZ  program can reference
  546.  another part of the same program through the jump or goto commands.
  547.  
  548.  For example:
  549.  
  550.    cmp buffer to Error!
  551.    jeq Errors
  552.    goto Elsewhere
  553.    --- Errors
  554.    end 2
  555.  
  556.  If  the  result  of  the  "cmp  buffer  to Error!" is equal, then the
  557.  program will  jump to  the location  labeled "Errors".  From there it
  558.  will end the program with an error level of 2.  If the result of  the
  559.  compare is not equal, then the program will goto the location labeled
  560.  Elsewhere.
  561. ┌─────────────────────────────────────────────────────────────────────┐
  562. │ abs NumericArgument                                                 │
  563. └─────────────────────────────────────────────────────────────────────┘
  564.  Computes the absolute  value of the  numeric argument and  places the
  565.  result in "result".
  566. ┌─────────────────────────────────────────────────────────────────────┐
  567. │ add NumericArgument1 and NumericArgument2                           │
  568. └─────────────────────────────────────────────────────────────────────┘
  569.  Adds the arguments shown and places the result in "result".
  570. ┌─────────────────────────────────────────────────────────────────────┐
  571. │ and TextArgument                                                    │
  572. └─────────────────────────────────────────────────────────────────────┘
  573.  CALL WITH:
  574.  
  575.    set start=<Position of first char>
  576.    set size=<Number of chars to And>
  577.    set char="Character to And with"
  578.  
  579.  Ands TextArgument with the specified character, starting at character
  580.  number  "start".  This  routine  will  end  after  "size"  number  of
  581.  characters have been anded.
  582.  
  583.  For example:
  584.  
  585.    set start=1
  586.    set size=13
  587.    set char=F
  588.    and TextArgument
  589.  
  590.  will And whatever text is in TextArgument with the letter F. It  will
  591.  do  this  starting  with  the  1st  character  until  it has anded 13
  592.  characters altogether.
  593. ┌─────────────────────────────────────────────────────────────────────┐
  594. │ acos NumericArgument                                                │
  595. │ asin NumericArgument                                                │
  596. │ atan NumericArgument                                                │
  597. │ acosh NumericArgument                                               │
  598. │ asinh NumericArgument                                               │
  599. │ atanh NumericArgument                                               │
  600. └─────────────────────────────────────────────────────────────────────┘
  601.  Compute the arccosine, arcsine, arctangent, archypcosine, archypsine,
  602.  or archyptangent  of the  numeric argument  and places  the result in
  603.  "result" (in units of radians).
  604.  
  605.  For example:
  606.  
  607.    arc cos SomeNumber
  608.    arc hyp cos AnotherNumber
  609.  
  610.  will compute the arccosine of SomeNumber and place the result of that
  611.  calculation in "result".  Then the archypcosine of AnotherNumber will
  612.  be computed and placed in "result".
  613.  
  614.  The range for the arc functions are: x²<=1
  615.  except for acosh in which            x²>=1
  616. ┌─────────────────────────────────────────────────────────────────────┐
  617. │ call LABEL                                                          │
  618. │ call TextArgument                                                   │
  619. └─────────────────────────────────────────────────────────────────────┘
  620.  CALL WITH:
  621.  
  622.    set start=<Position within TextArgument to find handle>
  623.  
  624.  Calls the  subroutine labeled  --- LABEL.  Starts executing  the next
  625.  instruction  following  the  ---  LABEL  instruction  until  a  "ret"
  626.  instruction  is  encountered.   Then  XYZ  starts  executing the next
  627.  instruction following the original call instruction.  Also will  call
  628.  the subroutine whose  address is stored  in TextArgument starting  at
  629.  "start".
  630.  
  631.  For example:
  632.  
  633.    set start=1
  634.    set handle=DoSomething
  635.    save handle to TextArgument
  636.    call DoSomething
  637.    call TextArgument
  638.    end with 0
  639.    --- DoSomething
  640.    ret
  641.  
  642.  will call  the subroutine  DoSomething.   DoSomething will  then just
  643.  return  to   the  statement   following  the   call  statement...call
  644.  TextArgument. Call TextArgument is the same as call DoSomething which
  645.  will  just  return  to  the  statement  following this call statement
  646.  "end", which will just end the program.
  647. ┌─────────────────────────────────────────────────────────────────────┐
  648. │ cmp NumericArgument1 to NumericArgument2                            │
  649. └─────────────────────────────────────────────────────────────────────┘
  650.  Compares the first numeric argument to the second.
  651. ┌─────────────────────────────────────────────────────────────────────┐
  652. │ cmp ReservedArgument1 to ReservedArgument2                          │
  653. └─────────────────────────────────────────────────────────────────────┘
  654.  Compares  the  first  reserved  argument  to  the  second.  The  only
  655.  exception to this rule is the reserved argument color because of  its
  656.  wider range  of 0  to 16,777,215.  All other  reserved arguments have
  657.  the range of 0 to 65535.
  658.  
  659.  For example:
  660.  
  661.    cmp size to mouse
  662.    cmp col to blank
  663.  
  664.  is legal while:
  665.  
  666.    cmp color to angle
  667.  
  668.  is not.
  669. ┌─────────────────────────────────────────────────────────────────────┐
  670. │ cmp TextArgument1 to TextArgument2                                  │
  671. └─────────────────────────────────────────────────────────────────────┘
  672.  CALL WITH:
  673.  
  674.    set start1=<Position of first character to Cmp in first argument>
  675.    set size=<Number of characters to Cmp>
  676.    set start2=<Position of first character to Cmp in second argument
  677.  
  678.  CoMPares  "size"  number  of  characters  in  the first TEXT argument
  679.  (starting at position "start") to the second TEXT argument  (starting
  680.  at position "start2").  These  reserved arguments must be Set  before
  681.  using  the  cmp  statement  for  the  first  time.   Cmp  counts each
  682.  character it  CoMPares until  it finds  the first  mismatch and  then
  683.  stops  and  reports  its  findings  of  the mismatch as greater than,
  684.  lesser than, equal  to (or some  combination of these).  The location
  685.  of this mismatch is returned to the reserved argument size.
  686.  
  687.  For example:
  688.  
  689.    set start1=1
  690.    set size=3
  691.    set start2=2
  692.    cmp Textargument1 to TextArgument2
  693.    jne Somewhere
  694.  
  695.  will take 3  characters of text  in TextArgument1 (starting  with the
  696.  1st character) and  CoMPare it to  whatever text is  in TextArgument2
  697.  (starting  with  the  2nd  character).   If  the  string contained in
  698.  TextArgument1 is
  699.  
  700.    HI!
  701.  
  702.  and the string contained in TextArgument2 is
  703.  
  704.    .HI?
  705.  
  706.  then cmp will  return a less  than and not  equal result to  XYZ, set
  707.  size to 3, and jump to the location --- Somewhere.
  708. ┌─────────────────────────────────────────────────────────────────────┐
  709. │ convert NumericArgument to TextArgument                             │
  710. │ convert ReservedArgument to TextArgument                            │
  711. │ convert TextArgument to result                                      │
  712. │ convert TextArgument to ReservedArgument                            │
  713. └─────────────────────────────────────────────────────────────────────┘
  714.  CALL WITH:
  715.  
  716.    set start=<Position of first character to start at>
  717.  
  718.  The  command  "convert  TextArgument  to  result"   will  start   the
  719.  conversion at "start" number of characters and will stop whenever  it
  720.  reaches either a space or  any invalid character (any character  that
  721.  is not a number). It will ALWAYS place the result in "result".
  722.  
  723.  For  the  command  "convert  NumericArgument  to  TextArgument"   the
  724.  characters will be placed in  the given TextArgument at the  position
  725.  "start" and  "size" will  be set  equal to  the number  of characters
  726.  converted  (how   many  significant   digits  were   placed  in   the
  727.  TextArgument).
  728. ┌─────────────────────────────────────────────────────────────────────┐
  729. │ cos NumericArgument                                                 │
  730. │ sin NumericArgument                                                 │
  731. │ tan NumericArgument                                                 │
  732. │ cosh NumericArgument                                                │
  733. │ sinh NumericArgument                                                │
  734. │ tanh NumericArgument                                                │
  735. └─────────────────────────────────────────────────────────────────────┘
  736.  Computes  the  cos,  sin,  tan,  cosh,  sinh,  or tanh of the numeric
  737.  argument and places the  result in "result". NumericArgument  must be
  738.  given in radians for the trig functions.
  739.  
  740.  The range for these trigs functions are: x²<∞ (infinity)
  741.  except for cosh in which                 x²<=1
  742.  and except for tan in which x cannot equal a multiple of π (pi).
  743. ┌─────────────────────────────────────────────────────────────────────┐
  744. │ dat num NumericArgument=                                            │
  745. │ dat txt ## TextArgument=                                            │
  746. │ dat mouse TextArgument                                              │
  747. └─────────────────────────────────────────────────────────────────────┘
  748.  The dat command is placed at the beginning of every XYZ program after
  749.  the first line (which is reserved for the size of num arguments). The
  750.  dat command  is where  all arguments  to be  used in  the program are
  751.  listed  (except  for  reserved  arguments).   For  example, if a text
  752.  argument is called that is not listed in a dat command, then an error
  753.  will result during compilation. Dat  places data into the numeric  or
  754.  text  argument  during  compilation  if  the  "="  sign  is used as a
  755.  delimiter. This is useful for reducing file sizes by setting  numeric
  756.  or text arguments before the  program has to run rather  then setting
  757.  them during run  time.  If  two dat statements  use the same  text or
  758.  numeric argument name, then the second statement will have no effect.
  759.  
  760.  SETTING TEXT ARGUMENTS...
  761.  
  762.  The  command,  "dat  txt  ##  TextArgument="  is  used  to define and
  763.  initialize  text  arguments.   The  ##  parameter  is used to reserve
  764.  memory for each text argument and can range from one to five thousand
  765.  or more characters in length. This is how much memory is reserved for
  766.  each text argument used. "Dat txt" statements that span more than one
  767.  line should be indented with  four spaces because XYZ will  terminate
  768.  the dat txt  statement when it  encounters ANY character  on the next
  769.  line (including the  TAB character).   Each successive line  starting
  770.  with four blanks will insert the "Enter" key into that text  argument
  771.  starting at the beginning of that line.
  772.  
  773.  For example:
  774.  
  775.    dat txt 00 SomeText=What \in/ the "world" is
  776.        this?
  777.    dat txt 10 MoreText=Hi!
  778.  
  779.  will insert the text string:
  780.  
  781.   What \in/ the "world" is
  782.   this?
  783.  
  784.  into the text argument SomeText, and the text string:
  785.  
  786.   Hi!
  787.  
  788.  into the text argument MoreText.  Notice that the first dat statement
  789.  will reserve only enough bytes of memory to be able to store the text
  790.  string listed, while the second  dat statement will reserve 10  bytes
  791.  of memory for the second text argument but initialize the first three
  792.  bytes to the word "Hi!".
  793.  
  794.  SETTING NUMERIC ARGUMENTS...
  795.  
  796.  The first line of EVERY XYZ  program is a three digit number  ranging
  797.  from 001 to 011. This number specifies how many words to reserve  for
  798.  each numeric argument (a word is two bytes of memory or disk  space).
  799.  This will also determine how  many significant digits will be  in all
  800.  numeric  arguments.   See  the  topic  "NUMERIC  argument  types" for
  801.  examples on the proper syntax for initializing numeric arguments.
  802.  
  803.  For example:
  804.  
  805.    dat num Volume=1.23e-4
  806.    dat num Molecules
  807.  
  808.  will reserve two numeric arguments.  The first will be set to 1.23e-4
  809.  and the second will contain uninitialized data.
  810.  
  811.  SETTING TEXT ARGUMENTS FOR CURSORS...
  812.  
  813.  For defining mouse cursors there is a special dat command. It is "dat
  814.  mouse" and it creates a text argument 34 bytes in length. The  syntax
  815.  is as follows:
  816.  
  817.   dat mouse TextArgument #### #### ─LOCATION OF x,y HOT SPOT
  818.   dat #### #### #### #### #### #### #### #### ─AND MASK
  819.   dat #### #### #### #### #### #### #### ####
  820.   dat #### #### #### #### #### #### #### #### ─XOR MASK
  821.   dat #### #### #### #### #### #### #### ####
  822.  
  823.  where #### represents  a string of  hex characters (0  through F). If
  824.  you do  not understand  how to  convert a  string of  pixels to a hex
  825.  number then don't worry because I have provided some example  cursors
  826.  that you can use anyways.  See the topic "Sample programs to compile"
  827.  for examples of how to create a new graphics cursor.
  828.  
  829.  The mouse cursor is HARDWARE defined  as a 16 pixel wide by  16 pixel
  830.  tall bitmap. The first two groups of hex characters are reserved  for
  831.  the X and Y coordinates of the hot spot of the cursor and should  not
  832.  exceed the range of  decimal  -128 to +128  ( 0081h > #### > FF85h ).
  833.  The next group of 16 hex characters are reserved for the  "overwrite"
  834.  pattern and the  last group of  16 hex characters  are for the  "xor"
  835.  pattern of the new cursor.
  836. ┌─────────────────────────────────────────────────────────────────────┐
  837. │ dec ReservedArgument                                                │
  838. └─────────────────────────────────────────────────────────────────────┘
  839.  Will decrement (subtract one from) the reserved argument shown.
  840. ┌─────────────────────────────────────────────────────────────────────┐
  841. │ div NumericArgument1 by NumericArgument2                            │
  842. └─────────────────────────────────────────────────────────────────────┘
  843.  Divides the  first argument  shown by  the second  argument shown and
  844.  places the result in "result".
  845. ┌─────────────────────────────────────────────────────────────────────┐
  846. │ draw circle                                                         │
  847. │ draw rotated circle                                                 │
  848. │ draw line                                                           │
  849. └─────────────────────────────────────────────────────────────────────┘
  850.  For "draw ellipse" and "draw rotated ellipse", call with:
  851.  
  852.    set wide=<Width of circle>
  853.    set hite=<Height of circle>
  854.    set color=<Color>
  855.    set angle=<Angle in degrees>
  856.    set mode=<Logical graphic function>
  857.    set col=<Column of circle center location>
  858.    set row=<Row of circle center location>
  859.  
  860.  Draws an ellipse in the current  color with it's center at "col"  and
  861.  "row".   The width  of the  ellipse will  be equal  to "wide" and the
  862.  height will  be equal  to "hite".   If wide  equals hite,  then "draw
  863.  ellipse" will draw  a circle.   If the optional  "rotate" argument is
  864.  used then the ellipse will be rotated by an angle of "angle"  degrees
  865.  with respect to the x-axis.  0,0 are the coordinates for the  topmost
  866.  left corner of  the video screen  with the coordinates  increasing in
  867.  value as you  go down and  to the right  on the screen.   The routine
  868.  will draw only partial circles if any of the points fall outside  the
  869.  current "xmin", "xmax", "ymin", and "ymax" settings.
  870.  
  871.  For "draw line", call with:
  872.  
  873.    set blank=<Number of blank points>
  874.    set col=<Beginning column>
  875.    set col2=<Ending column>
  876.    set color=<Color>
  877.    set dash1=<1st number of solid points>
  878.    set dash2=<2nd number of solid points>
  879.    set mode=<Logical graphic function>
  880.    set row=<Beginning row>
  881.    set row2=<Ending row>
  882.  
  883.  Draws a line from col1,row1 to the location col2,row2. The line  will
  884.  be drawn with the current color  "color" and will either (xor and  or
  885.  overwrite) whatever is already on the screen depending on the current
  886.  setting  of  the  reserved  argument  mode  (0=Unmodified  1=And 2=Or
  887.  3=Xor). Line will draw  "dash1" number of pixels followed  by "blank"
  888.  number of blank pixels followed  by "dash2" number of pixels  for the
  889.  length of  the line.   This allows line to  draw dashed  lines, solid
  890.  lines, or dash-dot lines.
  891.  
  892.  For example:
  893.  
  894.  Set these arguments to draw the following line (with each "-"
  895.  representing one pixel):
  896.                 --- -- --- -- --- -- --- -- --- -- ---
  897.                   
  898.    set dash1=3─┘  ││
  899.    set blank=1────┘│
  900.    set dash2=2─────┘
  901.  
  902.  a solid line would need to call draw line with this argument:
  903.  
  904.    set blank=0
  905. ┌─────────────────────────────────────────────────────────────────────┐
  906. │ end with ERRORLEVEL                                                 │
  907. └─────────────────────────────────────────────────────────────────────┘
  908.  Ends  the  XYZ  program  with  a  DOS error level equal to ERRORLEVEL
  909.  (which can range from 0 to 255)
  910.  
  911.  For example:
  912.  
  913.    end with 3
  914. ┌─────────────────────────────────────────────────────────────────────┐
  915. │ exp NumericArgument                                                 │
  916. └─────────────────────────────────────────────────────────────────────┘
  917.  Computes e raised to the power of the numeric argument and places the
  918.  result in "result".
  919. ┌─────────────────────────────────────────────────────────────────────┐
  920. │ ext ( TextString )                                                  │
  921. └─────────────────────────────────────────────────────────────────────┘
  922.  XYZ will write  the following group  of four hex  characters directly
  923.  into the program as literal instructions:
  924.  
  925.  For example:
  926.  
  927.    ext ( BE01 12AC 3C1A 7408 8AD0 B402 CD21 EBF3 CD20 )
  928.  
  929.  This statement  will write  the next  18 double  digit hex characters
  930.  into  the  XYZ  file  starting  at  the point where the ext statement
  931.  begins. The characters shown above are the hex representation of  the
  932.  machine code to perform the following commands:
  933.  
  934.        mov si, offset T2+2
  935.    T1: lodsb
  936.        cmp al, 26
  937.        je  T2
  938.        mov dl, al
  939.        mov ah, 02
  940.        int 21h
  941.        jmp T1
  942.    T2: int 20h
  943. ┌─────────────────────────────────────────────────────────────────────┐
  944. │ file close TextArgument/handle                                      │
  945. │ file create TextArgument                                            │
  946. │ file delete TextArgument                                            │
  947. │ file move TextArgument/handle                                       │
  948. │ file open TextArgument                                              │
  949. │ file read from TextArgument/handle to TextArgument                  │
  950. │ file reset TextArgument/handle                                      │
  951. │ file set TextArgument/handle                                        │
  952. │ file write from TextArgument to TextArgument/handle                 │
  953. └─────────────────────────────────────────────────────────────────────┘
  954.  CALL WITH:
  955.  
  956.    set size=<Number of bytes or chars>
  957.    set start=<Postion within TextArgument where handle is stored>
  958.  
  959.  All files must be specified by what are called "handles" because this
  960.  is the way  DOS handles files.   This "handle" is  simply a two  byte
  961.  binary number that DOS references for information about that file  in
  962.  order  to  perform  input  or  output  of  that  file  from the disk.
  963.  TextArgument will contain  just a text  string with the  path name of
  964.  the file.  TextArgument/Handle will  contain the handle of  the file.
  965.  "file open TextArgument" is the only command you can use to obtain  a
  966.  file handle from DOS.
  967.  
  968.  File will perform the following file Operations...
  969.  
  970.    ┌──────┬────────────────────────────────────────────────────────┐
  971.    │close │closes the file specified by the handle in TextArgument.│
  972.    ├──────┼────────────────────────────────────────────────────────┤
  973.    │create│creates the file  named in  TextArgument.  The dos  file│
  974.    │      │attribute will be set to "A" or "archive".              │
  975.    ├──────┼────────────────────────────────────────────────────────┤
  976.    │delete│deletes the file named in TextArgument.                 │
  977.    ├──────┼────────────────────────────────────────────────────────┤
  978.    │move  │increases the file pointer by "size" bytes.             │
  979.    ├──────┼────────────────────────────────────────────────────────┤
  980.    │open  │opens  the  existing  file named in  TextArgument.   The│
  981.    │      │reserved  argument  "handle"  will  be  set  to  the dos│
  982.    │      │handle for  that file.  The file  pointer will  be reset│
  983.    │      │for that file.                                          │
  984.    ├──────┼────────────────────────────────────────────────────────┤
  985.    │read  │reads  "size"  number  of  bytes  from  handle  of  file│
  986.    │      │specified in  TextArgument.   The file  pointer will  be│
  987.    │      │incriminated by "size" or by the actual number  of bytes│
  988.    │      │read. "size" will be set  to the actual number of  bytes│
  989.    │      │read.                                                   │
  990.    ├──────┼────────────────────────────────────────────────────────┤
  991.    │reset │resets  the  file pointer  to the beginning  of the file│
  992.    │      │specified by the handle in TextArgument.                │
  993.    ├──────┼────────────────────────────────────────────────────────┤
  994.    │set   │sets  the file pointer to the end of the file  specified│
  995.    │      │by the handle in TextArgument.                          │
  996.    ├──────┼────────────────────────────────────────────────────────┤
  997.    │write │writes  "size"  number  of  bytes from  handle  of  file│
  998.    │      │specified in TextArgument1  to TextArgument2.   The file│
  999.    │      │pointer will be incriminated by "size" or by  the actual│
  1000.    │      │number of bytes read.  "Size" will be set to the  actual│
  1001.    │      │number of bytes read.                                   │
  1002.    └──────┴────────────────────────────────────────────────────────┘
  1003.  
  1004.  If any operation  fails, then the  reserved argument "error"  will be
  1005.  set to the DOS error code and the error flag will be set for the  jer
  1006.  command to work.
  1007.  
  1008.  For  example  (assume  the  file  README.TXT  exists in the directory
  1009.  C:\DOS\UTILITIES\DOS\ and  reads "Scooby Dooby Doo"  and is therefore
  1010.  only 16 bytes in size):
  1011.  
  1012.    dat txt 00 FileName=C:\DOS\UTILITYS\DOC\README.TXT
  1013.    dat txt 00 NewText= we love you!
  1014.    dat txt 00 ErrMessage=Couldn't open file!
  1015.    dat txt 02 MyFile will be the handle for README.TXT
  1016.    set start=1
  1017.    file open FileName will open README.TXT...
  1018.    jer Oops! ...unless we couldn't find it!
  1019.    convert handle to MyFile
  1020.    set size=16 get ready to read 16 bytes...
  1021.    file read MyFile to buffer
  1022.    set size=12 since NewText is 12 bytes long
  1023.    file write NewText to MyFile
  1024.    file reset MyFile
  1025.    set size=28
  1026.    file read MyFile to buffer
  1027.    tty buffer
  1028.    file close MyFile
  1029.    end with 0 because everything went O.K.
  1030.    --- Oops!
  1031.    tty ErrMessage will print "Couldn't open file!" to screen.
  1032.    end with 1 because we had an error!
  1033.  
  1034.  Wow! Okay, what this example does  is first open the file whose  path
  1035.  name is in the  text argument FileName.   If the file doesn't  exist,
  1036.  the  program  will  detect  the  error  and goto the subroutine Oops!
  1037.  where it will end the program with an error level of 1.  If not  then
  1038.  it will read  16 bytes\chars into  the reserved text  argument buffer
  1039.  from the  file.   buffer will  now contain  the string  "Scooby Dooby
  1040.  Doo".  Next,  12 bytes\chars from  the text argument  NewText will be
  1041.  written to the file, starting  from wherever the last file  operation
  1042.  left the file  pointer at.   When the file  pointer is reset  to 0 by
  1043.  the file reset  command and the  file is reread  into buffer, we  see
  1044.  that buffer  will now  contain the  string "Scooby  Dooby Doo we love
  1045.  you!". Last  of all,  the file  will be  closed and  the program will
  1046.  exit with an error code of 0.
  1047. ┌─────────────────────────────────────────────────────────────────────┐
  1048. │ find char in TextArgument                                           │
  1049. └─────────────────────────────────────────────────────────────────────┘
  1050.  CALL WITH:
  1051.  
  1052.    set start=<What position to start at>
  1053.    set char=<Character to search for>
  1054.  
  1055.  Finds a  character in  the text  argument that  matches the character
  1056.  typed after char=, starting  from position "start". Find  counts each
  1057.  character it compares until it  finds the first match and  then stops
  1058.  and reports the location of  this match in reserved argument  "start"
  1059.  and also reports the number of characters it searched until it  found
  1060.  the match in reserved argument "size".
  1061.  
  1062.  For example:
  1063.  
  1064.    set char=Q
  1065.    set start=22
  1066.    find char in TextString
  1067.  
  1068.  will  search  for  the  letter  Q  in  the  text argument TextString,
  1069.  starting at the 22nd character in TextString.
  1070. ┌─────────────────────────────────────────────────────────────────────┐
  1071. │ goto LABEL                                                          │
  1072. │ goto TextArgument                                                   │
  1073. └─────────────────────────────────────────────────────────────────────┘
  1074.  Go to the subroutine labeled --- LABEL.
  1075. ┌─────────────────────────────────────────────────────────────────────┐
  1076. │ inc ReservedArgument                                                │
  1077. └─────────────────────────────────────────────────────────────────────┘
  1078.  Will increment (add one to) the reserved argument shown.
  1079. ┌─────────────────────────────────────────────────────────────────────┐
  1080. │ input TextArgument                                                  │
  1081. └─────────────────────────────────────────────────────────────────────┘
  1082.  CALL WITH:
  1083.  
  1084.    set start=<Position of first character to input in buffer>
  1085.    set size=<Number of characters to receive>
  1086.  
  1087.  Input waits for a key to be entered into the text argument. Any ASCII
  1088.  character may be entered in the  text string. It also returns a  scan
  1089.  code in the  reserved argument scan  if the keyboard  returns a blank
  1090.  (00 hex) character. This is useful for getting certain keys (like the
  1091.  function keys).
  1092.  
  1093.  For example:
  1094.  
  1095.    set start=3
  1096.    set size=24
  1097.    inp TextArgument
  1098.  
  1099.  will input a statement that will get 24 characters from the  keyboard
  1100.  and place it starting at the 3rd character location of TextArgument.
  1101. ┌─────────────────────────────────────────────────────────────────────┐
  1102. │ int HexInterruptNumber ax= bx= cx= dx= di= si= bp= es= ds=          │
  1103. └─────────────────────────────────────────────────────────────────────┘
  1104.  CALL WITH:
  1105.  
  1106.    set start=<Position within TextArgument to find handle>
  1107.  
  1108.  Performs the  hex interrupt  indicated.   Then it  sets the registers
  1109.  according  to  the  hex  values  set  with the arguments shown in the
  1110.  command above. All hex  numbers must be four  digits in length.   The
  1111.  number one would  be entered as  0001 and the  number 65535 would  be
  1112.  entered  as  FFFF.   For  setting  register  values  to point to text
  1113.  arguments, the reserved argument "start" must be set to the  position
  1114.  where to find the handle of a text argument within that TextArgument.
  1115.  Use caution  with this  command if  the ds  or es  registers will  be
  1116.  changed upon return of the interrupt.
  1117.  
  1118.  For example:
  1119.  
  1120.    set start=1
  1121.    set handle=TextString
  1122.    save handle to TextArgument
  1123.    int 21 ax=3900 dx=TextArgument
  1124.  
  1125.  will perform interrupt  21h, service ax=3900h  (Create Subdirectory).
  1126.  Upon  entry,  dx  will  contain  the  address  to  the  text argument
  1127.  TextString (which is always in the current data segment for XYZ).
  1128. ┌─────────────────────────────────────────────────────────────────────┐
  1129. │ ior TextArgument                                                    │
  1130. └─────────────────────────────────────────────────────────────────────┘
  1131.  CALL WITH:
  1132.  
  1133.    set start=<Position of first character to ior>
  1134.    set size=<Number of characters to ior>
  1135.    set char=<Character to ior with>
  1136.  
  1137.  Inclusively  ORs  the  text  argument  with  the specified character,
  1138.  starting at character number "start1".   This routine will end  after
  1139.  size of characters have been iored.
  1140.  
  1141.  For example:
  1142.  
  1143.    set start=4
  1144.    set size=23
  1145.    set char=R
  1146.    ior TextArgument
  1147.  
  1148.  will or  the text  argument with  the letter  R starting  at the  4th
  1149.  character and will or 23 characters altogether.
  1150. ┌─────────────────────────────────────────────────────────────────────┐
  1151. │ jeq LABEL                                                           │
  1152. │ jeq TextArgument                                                    │
  1153. └─────────────────────────────────────────────────────────────────────┘
  1154.  CALL WITH:
  1155.  
  1156.    set start=<Position within Textargument to find handle>
  1157.  
  1158.  If the result of the preceding cmp statement was EQUAL, then goto the
  1159.  subroutine labeled --- LABEL in the program.
  1160. ┌─────────────────────────────────────────────────────────────────────┐
  1161. │ jer LABEL                                                           │
  1162. │ jer TextArgument                                                    │
  1163. └─────────────────────────────────────────────────────────────────────┘
  1164.  CALL WITH:
  1165.  
  1166.    set start=<Position within TextArgument to find handle>
  1167.  
  1168.  If the result of  the last operation caused  an error, then goto  the
  1169.  subroutine labeled --- LABEL in the program.
  1170. ┌─────────────────────────────────────────────────────────────────────┐
  1171. │ jge LABEL                                                           │
  1172. │ jge TextArgument                                                    │
  1173. └─────────────────────────────────────────────────────────────────────┘
  1174.  CALL WITH:
  1175.  
  1176.    set start=<Position within Textargument to find handle>
  1177.  
  1178.  If the  result of  the preceding  cmp statement  was GREATER  than or
  1179.  EQuaL, then goto the subroutine labeled --- LABEL in the program.
  1180. ┌─────────────────────────────────────────────────────────────────────┐
  1181. │ jgt LABEL                                                           │
  1182. │ jgt TextArgument                                                    │
  1183. └─────────────────────────────────────────────────────────────────────┘
  1184.  CALL WITH:
  1185.  
  1186.    set start=<Position within Textargument to find handle>
  1187.  
  1188.  If the result of the  preceding cmp statement was GREATER  THAN, then
  1189.  goto the subroutine labeled --- LABEL in the program.
  1190. ┌─────────────────────────────────────────────────────────────────────┐
  1191. │ jle LABEL                                                           │
  1192. │ jle TextArgument                                                    │
  1193. └─────────────────────────────────────────────────────────────────────┘
  1194.  CALL WITH:
  1195.  
  1196.    set start=<Position within Textargument to find handle>
  1197.  
  1198.  If the result of the preceding cmp statement was LESS THAN or  EQUAL,
  1199.  then goto the subroutine labeled --- LABEL in the program.
  1200. ┌─────────────────────────────────────────────────────────────────────┐
  1201. │ jlt LABEL                                                           │
  1202. │ jlt TextArgument                                                    │
  1203. └─────────────────────────────────────────────────────────────────────┘
  1204.  CALL WITH:
  1205.  
  1206.    set start=<Position within Textargument to find handle>
  1207.  
  1208.  If the result of the preceding cmp statement was LESS THAN, then goto
  1209.  the subroutine labeled --- LABEL in the program.
  1210. ┌─────────────────────────────────────────────────────────────────────┐
  1211. │ jne LABEL                                                           │
  1212. │ jne TextArgument                                                    │
  1213. └─────────────────────────────────────────────────────────────────────┘
  1214.  CALL WITH:
  1215.  
  1216.    set start=<Position within Textargument to find handle>
  1217.  
  1218.  If the result of the preceding cmp statement was NOT EQUAL, then goto
  1219.  the subroutine labeled --- LABEL in the program.
  1220. ┌─────────────────────────────────────────────────────────────────────┐
  1221. │ len TextArgument                                                    │
  1222. └─────────────────────────────────────────────────────────────────────┘
  1223.  Gets the  LENgth of  the string  in the  TextArgument and places that
  1224.  value in the reserved variable size. It starts by counting the  first
  1225.  character  in  the  argument  until  it  reaches  the  first  "Enter"
  1226.  character.
  1227. ┌─────────────────────────────────────────────────────────────────────┐
  1228. │ log NumericArgument                                                 │
  1229. └─────────────────────────────────────────────────────────────────────┘
  1230.  Computes the natural LOGarithm of the numeric argument and places the
  1231.  result in "result".
  1232. ┌─────────────────────────────────────────────────────────────────────┐
  1233. │  mouse Command                                                      │
  1234. │  mouse cursor=TextArgument                                          │
  1235. └─────────────────────────────────────────────────────────────────────┘
  1236.  is the  command for  controlling the  mouse. The  following text is a
  1237.  list of the various mouse functions controlled by mouse:
  1238.  
  1239.    ┌──────┬─────────────────────────────────────────────────────────┐
  1240.    │button│Will  return  the status of  the mouse buttons. There are│
  1241.    │      │two buttons (left  and right) which  can be in one of two│
  1242.    │      │states (pressed or released). The jeq or jne command  can│
  1243.    │      │be used to detect whether or not a button was  pressed or│
  1244.    │      │released after the but command executes. Jeq is the  same│
  1245.    │      │as saying jump if true and jne is the same as saying jump│
  1246.    │      │if false.   But will  also return  the coordinates of the│
  1247.    │      │mouse  cursor  hot  spot  to  the  col  and  row reserved│
  1248.    │      │arguments (they will remain unchanged if the button being│
  1249.    │      │checked had not  been pressed or  released since the last│
  1250.    │      │call to but). Notice that when rat but is called with... │
  1251.    │      ├─────────────────────────────────────────────────────────┤
  1252.    │      │mouse set equal to 0, then the status of the  left button│
  1253.    │      │being pressed will be checked.                           │
  1254.    │      ├─────────────────────────────────────────────────────────┤
  1255.    │      │mouse set  equal  to  1,  then  the  status  of the right│
  1256.    │      │button being pressed will be checked.                    │
  1257.    │      ├─────────────────────────────────────────────────────────┤
  1258.    │      │mouse set  equal  to  2,  then the simultaneous status of│
  1259.    │      │both buttons being pressed will be checked.              │
  1260.    │      ├─────────────────────────────────────────────────────────┤
  1261.    │      │mouse set equal to 3,  then the status of the left button│
  1262.    │      │being released will be checked.                          │
  1263.    │      ├─────────────────────────────────────────────────────────┤
  1264.    │      │mouse set  equal  to  4,  then  the  status  of the right│
  1265.    │      │button being released will be checked.                   │
  1266.    │      ├─────────────────────────────────────────────────────────┤
  1267.    │      │mouse set  equal  to  5,  then the simultaneous status of│
  1268.    │      │both buttons being released will be checked.             │
  1269.    ├──────┼─────────────────────────────────────────────────────────┤
  1270.    │cursor│Will  change the  graphics  cursor to the graphics cursor│
  1271.    │      │stored  in  TextArgument.  The  cursor  must  have   been│
  1272.    │      │created by a dat mouse  statement at the beginning of the│
  1273.    │      │XYZ source file.                                         │
  1274.    ├──────┼─────────────────────────────────────────────────────────┤
  1275.    │hide  │Hides mouse cursor.                                      │
  1276.    ├──────┼─────────────────────────────────────────────────────────┤
  1277.    │horz  │Sets  the   Min/Max  range  for   the  horizontal  cursor│
  1278.    │      │position.Called with the Min range in the col and the Max│
  1279.    │      │range in the row reserved arguments.                     │
  1280.    ├──────┼─────────────────────────────────────────────────────────┤
  1281.    │pen   │Turns light pen on if mouse is set  equal to 1 and  turns│
  1282.    │      │the light pen off if mouse is set equal to 0 when the pen│
  1283.    │      │routine is called.                                       │
  1284.    ├──────┼─────────────────────────────────────────────────────────┤
  1285.    │reset │Turns on the mouse and resets it.                        │
  1286.    ├──────┼─────────────────────────────────────────────────────────┤
  1287.    │show  │Displays cursor.                                         │
  1288.    ├──────┼─────────────────────────────────────────────────────────┤
  1289.    │vert  │Sets the Min/Max range for the vertical  cursor position.│
  1290.    │      │Called with the Min range in the row and the Max range in│
  1291.    │      │the col reserved arguments.                              │
  1292.    └──────┴─────────────────────────────────────────────────────────┘
  1293.  
  1294.  For example:
  1295.  
  1296.    set mouse=0
  1297.    mouse button
  1298.    jeq LeftButtonPressed
  1299.    jne LeftButtonNotPressed
  1300.    --- LeftButtonPressed
  1301.    mouse cursor=NewCursor
  1302.    --- LeftButtonNotPressed
  1303.    end
  1304.  
  1305.  will jump to the label "--- LeftButtonPressed" if the right button of
  1306.  the mouse was  pressed, load a  new mouse cursor  stored in the  text
  1307.  argument NewCursor, then quit  the program. Otherwise, XYZ  will jump
  1308.  to the label "--- LeftButtonNotPressed" and quit.
  1309. ┌─────────────────────────────────────────────────────────────────────┐
  1310. │ mul NumericArgument1 by NumericArgument2                            │
  1311. └─────────────────────────────────────────────────────────────────────┘
  1312.  Multiplies the first  numeric argument or constant argument with  the
  1313.  second and places the result in "result".
  1314. ┌─────────────────────────────────────────────────────────────────────┐
  1315. │ neg NumericArgument                                                 │
  1316. └─────────────────────────────────────────────────────────────────────┘
  1317.  NEGates the numeric argument.
  1318. ┌─────────────────────────────────────────────────────────────────────┐
  1319. │ plot                                                                │
  1320. └─────────────────────────────────────────────────────────────────────┘
  1321.  CALL WITH:
  1322.  
  1323.    set color=<Color>
  1324.    set angle=<Angle in degrees>
  1325.    set col=<Center of rotation...X position>
  1326.    set row=<Center of rotation...Y position>
  1327.    set col2=<Point starting...X position>
  1328.    set row2=<Point starting...Y position>
  1329.  
  1330.  Plots the current color "color" to  the given Column and Row (in  the
  1331.  reserved arguments  row2 and  col2. The  point will  be rotated by an
  1332.  angle of "angle"   degrees with respect  to the x-axis  of the  video
  1333.  screen. 0,0 are  the coordinates for  the topmost left  corner of the
  1334.  video screen with the coordinates increasing in value as you go  down
  1335.  and to the right on the screen.  The routine will not draw any points
  1336.  if  any  of  the  points  fall  outside  the  current "xmin", "xmax",
  1337.  "ymin", and "ymax" settings.
  1338. ┌─────────────────────────────────────────────────────────────────────┐
  1339. │ prn TextArgument                                                    │
  1340. └─────────────────────────────────────────────────────────────────────┘
  1341.  CALL WITH:
  1342.  
  1343.    set start=<Position of first character to Prn>
  1344.    set size=<Number of characters to Prn>
  1345.    set lptn=<LPTn to use>
  1346.  
  1347.  Prints the contents of the given text argument starting at  character
  1348.  "start" and stopping after "size" characters have been printed.
  1349.  
  1350.  For example:
  1351.  
  1352.    set lptn=1
  1353.    set start=2
  1354.    set size=21
  1355.    prn TextArgument
  1356.  
  1357.  will print all the text stored in TextArgument (starting with the 2nd
  1358.  character and ending with the 23rd) out to the printer LPT1.
  1359.  
  1360.  NOTE:  LPT  numbers  start  at  0  and  go up to 3. Most printers are
  1361.  connected to LPT0 which is the default parallel or printer port  that
  1362.  comes with most IBM compatible  computers (IBM is a trademark  of IBM
  1363.  Corp). The second printer will be connected to LPT1 and so on.
  1364. ┌─────────────────────────────────────────────────────────────────────┐
  1365. │ push TextArgument                                                   │
  1366. │ pop TextArgument                                                    │
  1367. │ push ReservedArgument                                               │
  1368. │ pop ReservedArgument                                                │
  1369. └─────────────────────────────────────────────────────────────────────┘
  1370.  CALL WITH:
  1371.  
  1372.    set start=<Position within TextArgument to make pop or push>
  1373.  
  1374.  These two instructions are the  most dangerous commands that you  can
  1375.  use. Since push  will save two  characters (ie --  one word, starting
  1376.  at position "start" within the called text argument or will save  the
  1377.  reserved  argument)  on  the  executable  file's stack, and since the
  1378.  stack is also where  the next return address  for a call function  is
  1379.  stored, you must  be sure to  pop whatever you  push or your  program
  1380.  will crash.
  1381.  
  1382.  Pop  will  restore  two  characters  (one  word) starting at position
  1383.  "start"  within  the  called  text  argument  or  will restore to the
  1384.  reserved argument.  These characters (or word) will be restored  from
  1385.  whatever is on the executable file's stack.
  1386.  
  1387.  The  exception  to  this  command  is  for  pushing  and  popping the
  1388.  reserved arguments "color" and  "color2". This is a  three  character
  1389.  save and restore and therefore these two reserved arguments can  only
  1390.  be used with each other.
  1391. ┌─────────────────────────────────────────────────────────────────────┐
  1392. │ read                                                                │
  1393. └─────────────────────────────────────────────────────────────────────┘
  1394.  CALL WITH:
  1395.  
  1396.    set col2=<Column>
  1397.    set row2=<Row>
  1398.  
  1399.  Reads the color of the pixel at  the Column and Row given by the  col
  1400.  and row  reserved arguments  and places  it in  the reserved argument
  1401.  color2.
  1402.  
  1403.  For example:
  1404.  
  1405.    set col2=640
  1406.    set row2=480
  1407.    set color=12 00 00
  1408.    read
  1409.    cmp color to color2
  1410.    jle Somewhere
  1411.  
  1412.  will read the color of the pixel at location (640, 480) of the screen
  1413.  and compare the  color returned to  the color placed  in the reserved
  1414.  argument "color". If it  is less than or  equal to that then  it will
  1415.  jump to the label called Somewhere.
  1416. ┌─────────────────────────────────────────────────────────────────────┐
  1417. │ ret                                                                 │
  1418. └─────────────────────────────────────────────────────────────────────┘
  1419.  RETurns from a subroutine to the CALLing routine. See the topic 
  1420.  "call".
  1421. ┌─────────────────────────────────────────────────────────────────────┐
  1422. │ save Textargument1 to TextArgument2                                 │
  1423. │ save NumericArgument1 to NumericArgument2                           │
  1424. └─────────────────────────────────────────────────────────────────────┘
  1425.  CALL WITH:
  1426.  
  1427.    set start=<Position of first character to Sav>
  1428.    set size=<Number of characters to Sav>
  1429.    set start2=<Position of first character to Sav in second argument>
  1430.  
  1431.  Saves the contents  of the first  text or numeric  argument (starting
  1432.  with character "start"  until "size" characters  have been saved)  by
  1433.  placing it into the second text or numeric argument (starting at  the
  1434.  position "start2").  For  the numeric arguments, "start",  "size", and
  1435.  "start2" have no effect.
  1436.  
  1437.  For example:
  1438.  
  1439.    set start=2
  1440.    set size=13
  1441.    set start2=3
  1442.    save ThisString to ThatString
  1443.  
  1444.  will take 13 characters of text in ThisString (starting with the  2nd
  1445.  character)  and  save  it  to  ThatString  (starting  with  the   3rd
  1446.  character).
  1447. ┌─────────────────────────────────────────────────────────────────────┐
  1448. │ scr to TextArgument                                                 │
  1449. │ scr from TextArgument                                               │
  1450. └─────────────────────────────────────────────────────────────────────┘
  1451.  CALL WITH:
  1452.  
  1453.    set wide=<Width>
  1454.    set hite=<Height>
  1455.    set col=<Starting Col>
  1456.    set row=<Starting Row>
  1457.  
  1458.  Copies the contents of  the SCReen  to memory  or from  memory to the
  1459.  screen.  The reserved argument  "hite" determines the height and  the
  1460.  reserved  argument  "wide"  determines  the  width  of the area to be
  1461.  copied from  the screen  to the  memory.   The starting  point of the
  1462.  copy routine is col,row.
  1463. ┌─────────────────────────────────────────────────────────────────────┐
  1464. │ set ReservedArgument=Number <or "character">                        │
  1465. │ set TextArgument=ReservedArgument                                   │
  1466. │ set handle=<any argument or label>                                  │
  1467. │ set tty cursor                                                      │
  1468. │ set tty blink                                                       │
  1469. │ set videomode=<see list>                                            │
  1470. └─────────────────────────────────────────────────────────────────────┘
  1471.  Sets the reserved argument equal  to a number, where number  equals 0
  1472.  to 65535  (16,777,215 for  the reserved  argument color)  or sets the
  1473.  reserved argument equal  to a single  character.  The  number may not
  1474.  exceed the range defined for that reserved argument as defined in the
  1475.  section RESERVED arguments.
  1476.  
  1477.  For example:
  1478.  
  1479.    set angle=33000
  1480.    set char=D
  1481.  
  1482.  will set the reserved argument  angle equal to 33,000 and  places the
  1483.  letter D in reserved argument char.
  1484.  
  1485.  ---------------------------------------------------------------------
  1486.  
  1487.  The command "set handle=" is a special case for the set command. When
  1488.  "set handle=" is used, handle will be set to the address of a label 
  1489.  or argument only. Set handle cannot be set to equal a character or a 
  1490.  number like the other reserved arguments can.
  1491.  
  1492.  For example:
  1493.  
  1494.    set handle=TextArgument
  1495.    set handle=LABEL
  1496.  
  1497.  ---------------------------------------------------------------------
  1498.  
  1499.  Setting the reserved arguments "color" or "color2" is also a  special
  1500.  case in that you  must list three 2-digit  hex numbers in a  row like
  1501.  this:
  1502.  
  1503.    set color=XX YY ZZ
  1504.  
  1505.  The  reason  for  using  hex  numbers  is because almost all computer
  1506.  reference books  list colors  in terms  of hex  numbers. This way you
  1507.  won't have to convert from hex  to decimal or vice versa, when  doing
  1508.  research on these various modes:
  1509.  
  1510.     In text modes      XX should equal the color
  1511.                        YY should equal the page number
  1512.                        ZZ should equal 00
  1513.     In 16 color modes  XX should equal the color
  1514.                        YY should equal 00
  1515.                        ZZ should equal 00
  1516.     In 256 color modes XX should equal the color
  1517.                        YY should equal 00
  1518.                        ZZ should equal 00
  1519.     In SVGA modes      XX should equal the red color component
  1520.                        YY should equal the green color component
  1521.                        ZZ should equal the blue color component
  1522.  
  1523.  ---------------------------------------------------------------------
  1524.  
  1525.  For the "set tty cursor" and "set tty blink", call with:
  1526.  
  1527.    set color=<Color and attribute of character to print>
  1528.    set start=<Position of first character to print>
  1529.    set size=<Number of characters to print>
  1530.    set col=<Cursor column>
  1531.    set row=<Cursor row>
  1532.    set mode=<1 or 0>
  1533.  
  1534.  To change the cursor position, use the "set tty cursor" option to set
  1535.  the cursor  to the  coordinates specified  by the  reserved arguments
  1536.  "row" and "col".
  1537.  
  1538.  To  change  the  character  attribute  in  text  modes  or change the
  1539.  character color in graphics modes, use the reserved argument  "color"
  1540.  set to a number from 00-FF (See Appendix)
  1541.  
  1542.  To  change  the  available  attribute  from  blinking  colors to high
  1543.  intensity colors (in text modes only), use the "set tty blink" option
  1544.  with  "mode"  set  to  1  for  using  blinking attributes or to 0 for
  1545.  high-intensity attributes.
  1546.  
  1547.  For example:
  1548.  
  1549.    set col=0
  1550.    set row=0
  1551.    set tty cursor
  1552.    set mode=0
  1553.    set tty blink
  1554.    set color=135
  1555.    set start=1
  1556.    set size=99
  1557.    tty ThisString
  1558.  
  1559.  will place the cursor at the topmost left corner of the screen.  Then
  1560.  it  will  choose  high  intensity  attributes  meaning that the color
  1561.  number 135  will be  high-intensity white  on a  black background. It
  1562.  will print text to the  screen, starting from the first  character in
  1563.  the  text  argument   ThisString  until  it   finishes  printing   99
  1564.  characters (about two rows).
  1565.  
  1566.  ---------------------------------------------------------------------
  1567.  
  1568.  For  the  "set  videomode="  command,  XYZ  currently  supports   the
  1569.  following EGA/VGA video modes (Where  A equals Mode, B equals  Number
  1570.  of  colors,  C  equals  Rows  x  Columns,  and D equals Type of video
  1571.  displayed):
  1572.  
  1573.   ┌───┬─────┬─────────┬────────┐
  1574.   │  A│    B│        C│       D│
  1575.   ├───┼─────┼─────────┼────────┤
  1576.   │  2│   16│    80x25│    Text│
  1577.   │  3│   16│    80x25│    Text│
  1578.   ├───┼─────┼─────────┼────────┤
  1579.   │ 13│  256│  320x200│Graphics│
  1580.   ├───┼─────┼─────────┼────────┤
  1581.   │ 10│   16│  640x350│Graphics│
  1582.   ├───┼─────┼─────────┼────────┤
  1583.   │ 12│   16│  640x480│Graphics│
  1584.   └───┴─────┴─────────┴────────┘
  1585.  
  1586.  and the following Super VGA video modes:
  1587.  
  1588.   ┌───┬─────┬─────────┬────────┐
  1589.   │108│   16│    80x60│    Text│
  1590.   │109│   16│   132x25│    Text│
  1591.   │10A│   16│   132x43│    Text│
  1592.   │10B│   16│   132x50│    Text│
  1593.   │10C│   16│   132x60│    Text│
  1594.   ├───┼─────┼─────────┼────────┤
  1595.   │101│  256│  640x480│Graphics│
  1596.   │110│  32K│  640x480│Graphics│
  1597.   │111│  64K│  640x480│Graphics│
  1598.   │112│16.8M│  640x480│Graphics│
  1599.   ├───┼─────┼─────────┼────────┤
  1600.   │102│   16│  800x600│Graphics│
  1601.   │103│  256│  800x600│Graphics│
  1602.   │113│  32K│  800x600│Graphics│
  1603.   │114│  64K│  800x600│Graphics│
  1604.   │115│16.8M│  800x600│Graphics│
  1605.   ├───┼─────┼─────────┼────────┤
  1606.   │105│  256│ 1024x768│Graphics│
  1607.   │116│  32K│ 1024x768│Graphics│
  1608.   │117│  64K│ 1024x768│Graphics│
  1609.   │118│16.8M│ 1024x768│Graphics│
  1610.   ├───┼─────┼─────────┼────────┤
  1611.   │107│  256│1280x1024│Graphics│
  1612.   │119│  32K│1280x1024│Graphics│
  1613.   │11A│  64K│1280x1024│Graphics│
  1614.   │11B│16.8M│1280x1024│Graphics│
  1615.   └───┴─────┴─────────┴────────┘
  1616.  
  1617.  XYZ Super VGA  modes are based  on the VESA  standard and it  must be
  1618.  loaded  in  either  AUTOEXEC.BAT,  CONFIG.SYS,  or is included in the
  1619.  video board hardware.
  1620.  
  1621.  The  VGA/EGA  graphics  modes  2-13  and  modes 108-10C have what are
  1622.  called color  palettes.   This color  palette is  filled with as many
  1623.  colors as that mode  will support.  Sixteen  color modes will have  a
  1624.  sixteen color palette  with each color  numbered 00 through  0F.  256
  1625.  color modes will  have a 256  color palette with  each color numbered
  1626.  00 through FF.  The colors  defined by each number are predefined  by
  1627.  the VGA/EGA standard.  For  all other graphics modes, the  colors are
  1628.  defined  by  the  actual  number  placed  on  the  screen by the plot
  1629.  routine.  See  appendix  A  for  charts  on the actual definitions of
  1630.  colors for the various modes.
  1631.  
  1632.  As  of  this  writing,  there  is  no  support for the mouse graphics
  1633.  cursor in Super  VGA modes because  no standard has  been adopted yet
  1634.  by all manufacturers  that will allow  programmers to have  access to
  1635.  the  mouse  cursor  in  Super  VGA  modes.  My options are to write a
  1636.  non-standard interface for  you, wait for  manufacturers to come  out
  1637.  with a  standard, or  provide source  code on  how to  write your own
  1638.  interface. If you don't mind, please  drop me a line and let  me know
  1639.  which option you think would be best.
  1640. ┌─────────────────────────────────────────────────────────────────────┐
  1641. │ slm Mode                                                            │
  1642. └─────────────────────────────────────────────────────────────────────┘
  1643.  Sets the  Line Mode  for text  modes (if  possible) to  23, 43, or 50
  1644.  line mode. The screen will be cleared after the slm command has  been
  1645.  used.
  1646.  
  1647.  For example:
  1648.  
  1649.    slm 50
  1650.  
  1651.  will  set  the  current text  mode display to  50 lines if  I  am  in
  1652.  video mode 2 or 3.
  1653. ┌─────────────────────────────────────────────────────────────────────┐
  1654. │ snd                                                                 │
  1655. │ snd off                                                             │
  1656. └─────────────────────────────────────────────────────────────────────┘
  1657.  CALL WITH:
  1658.  
  1659.    set freq=<Freq>
  1660.  
  1661.  Modulates  the  pc  speaker  with  the  specified  frequency  in  the
  1662.  reserved argument freq. Once  a frequency is   set the  speaker  will
  1663.  continue to Sound  until another snd   statement is encountered  that
  1664.  either changes the frequency or turns it off.
  1665.  
  1666.  For example:
  1667.  
  1668.    set freq=256
  1669.    snd
  1670.  
  1671.  will cause the PC speaker to oscillate at 256 hertz.
  1672. ┌─────────────────────────────────────────────────────────────────────┐
  1673. │ sub NumericArgument2 from NumericArgument1                          │
  1674. └─────────────────────────────────────────────────────────────────────┘
  1675.  SUBtracts the arguments shown and places the result in "result".
  1676.  
  1677.  For example:
  1678.  
  1679.    sub NumericArgument2 from NumericArgument1
  1680. ┌─────────────────────────────────────────────────────────────────────┐
  1681. │ tty TextArgument                                                    │
  1682. └─────────────────────────────────────────────────────────────────────┘
  1683.  Prints the given text argument to the screen. The ASCII codes for the
  1684.  bell(07),  the  backspace(08),  the  linefeed(10),  and  the carriage
  1685.  return(13) are translated to the  appropriate actions.  Line wrap and
  1686.  scrolling are  also performed  automatically. In  graphics modes, tty
  1687.  will only print out to the monitor using color codes 1 - 255 (See the
  1688.  chart in appendix A).
  1689. ┌─────────────────────────────────────────────────────────────────────┐
  1690. │ wait ##                                                             │
  1691. └─────────────────────────────────────────────────────────────────────┘
  1692.  Wait will do nothing until ## of DOS ticks have elapsed. One DOS tick
  1693.  is equal to 55mS and is the same on all IBM compatible computers.  If
  1694.  ## equals 18, then wait will do nothing until one second has elapsed.
  1695.  This is  useful for  automatic pausing  before resuming  a task.  The
  1696.  maximum number of DOS ticks is 65535 which is about one hour.
  1697. ┌─────────────────────────────────────────────────────────────────────┐
  1698. │ xor TextArgument with Character                                     │
  1699. │ xor TextArgument1 with TextArgument2                                │
  1700. └─────────────────────────────────────────────────────────────────────┘
  1701.  CALL WITH:
  1702.  
  1703.    set start=<Position of first character to Xor>
  1704.    set size=<Number of characters to Xor>
  1705.    set char=<Character to Xor with>
  1706.  
  1707.  XORs the given text  argument with the specified  character, starting
  1708.  at character number "start".   This routine will end after  "size" of
  1709.  characters have been XORed unless the second argument is another text
  1710.  argument. Then the first text argument will be XORed with the  second
  1711.  text argument until  starting at character  number "start" until  all
  1712.  characters have been used up in either the first or second arguments.
  1713.  
  1714.  For example:
  1715.  
  1716.    set start=4
  1717.    set size=23
  1718.    set char=R
  1719.    xor TextArgument
  1720.  
  1721.  will xor  the text  argument with  the letter  R starting  at the 4th
  1722.  character and will xor 23 characters altogether.
  1723. ╔═════════════════════════════════════════════════════════════════════╗
  1724. ║ XYZ COMPILE TIME ERROR MESSAGES:                                    ║
  1725. ╚═════════════════════════════════════════════════════════════════════╝
  1726.  "Error on line number ##"
  1727.    Shows on which line in the source file that the error occurred. 
  1728.    Line number 0 is the command line. 
  1729.  "...unable to open file!"
  1730.    Possibly the wrong file name was typed in on the DOS command line.
  1731.  "...file must start with numeric size!"
  1732.    All XYZ source files start with a number. See the topic titled
  1733.    "Sample programs to compile" for an example.
  1734.  "...incorrect use of XYZ command!"
  1735.    Usually a reserved argument was misspelled or missing.
  1736.  "...nonexistent argument was given!"
  1737.    An argument was expected but there was none. Check syntax for that
  1738.    command.
  1739.  "...argument must be numeric!"
  1740.  "...argument must be text!"
  1741.  "...nonexistent label was given!"
  1742.    The label called out for wasn't found.
  1743.  "...argument types don't match!"
  1744.    Arguments must both be numeric or text or reserved.
  1745.  "...file size greater that 64k!"
  1746.    Maximum size of an XYZ program is 64k.
  1747.  "...too many characters on the command line!"
  1748.    Maximum number of characters per line in the source file is 111
  1749.    characters.
  1750.  "...argument must be a label!"
  1751.  "...argument must equal 25, 43, or 50!"
  1752.  "...nonexistent command was given!"
  1753.    Usually a command was misspelled or missing.
  1754. ╔═════════════════════════════════════════════════════════════════════╗
  1755. ║ Reporting bugs or giving advice                                     ║
  1756. ╚═════════════════════════════════════════════════════════════════════╝
  1757.  You  do  not  have  to  be  a  registered user to report bugs or give
  1758.  advice.  Any  input you give  to me will  be appreciated, although  I
  1759.  probably won't  be able  to respond  to you  personally, depending on
  1760.  the number of  responses I get.  The kind of  advice I would  like to
  1761.  see would be something like:
  1762.  
  1763.    How to make the programs more readable
  1764.    How to explain a command simpler
  1765.    New commands to make XYZ easier or more convenient
  1766.    And so on...
  1767.  
  1768.  Please send your comments to:
  1769.  
  1770.    XYZ
  1771.    PO BOX #40943
  1772.    Tempe, AZ 85274
  1773.  
  1774.  You can also leave comments on the Internet at xyz@netzone.com
  1775.  
  1776.  Some examples of some ideas that have already been suggested are:
  1777.  
  1778.    Add complex number calculation capability
  1779.    Make dat statements that can do arrays
  1780.    Enable extended memory to be usable for storing data
  1781.  
  1782.  If enough people respond, I will implement these suggestions with the
  1783.  next release of XYZ.
  1784. ╔═════════════════════════════════════════════════════════════════════╗
  1785. ║ Sample programs to compile                                          ║
  1786. ╚═════════════════════════════════════════════════════════════════════╝
  1787.  Copy these sample programs to  a separate file and compile  them with
  1788.  the XYZ compiler. Some programs may need to be edited to fit in  less
  1789.  than 30 lines of source code, IF you are compiling with the shareware
  1790.  version of XYZ.
  1791.  
  1792.  To compile  these files  you will  need to  type "xyz  <name of  your
  1793.  source file> <name.com>". For example, the following sample file  may
  1794.  be compiled by typing "xyz rat.src rat.com" at the command line.
  1795.  
  1796.    000 This is a sample test file for various mouse cursors
  1797.    /// The compiled version of this program can be found
  1798.    /// under the name "rat.com" in this directory.
  1799.    dat mouse GunSight 0007 0007
  1800.    dat F39F CFE7 9FF3 BFFB 7FFD 7FFD FFFF FFFF
  1801.    dat 7FFD 7FFD 7FFD BFFB 9FF3 CFE7 F39F FFFF
  1802.    dat 0280 0EE0 1EF0 3EF8 7EFC 7EFC FEFE 0000
  1803.    dat FEFE 7EFC 7EFC 3EF8 1EF0 0EE0 0280 0000
  1804.    dat mouse crosshair 0007 0007
  1805.    dat FDFF F8FF F8FF F8FF F8FF 820F 0707 820F
  1806.    dat F8FF F8FF F8FF F8FF FDFF FFFF FFFF FFFF
  1807.    dat 0000 0200 0200 0200 0200 0000 78F0 0000
  1808.    dat 0200 0200 0200 0200 0000 0000 0000 0000
  1809.    dat mouse downarrow 0007 0007
  1810.    dat F83F F83F F83F F83F F83F F83F F83F F83F
  1811.    dat F83F F83F C007 C007 E00F F01F F83F FC7F
  1812.    dat 0000 0380 0380 0380 0380 0380 0380 0380
  1813.    dat 0380 0380 0380 1FF0 0FE0 07C0 0380 0100
  1814.    dat mouse lefthand 0007 0007
  1815.    dat FFFF FFFF FC01 FC00 0000 0000 0000 F000
  1816.    dat F000 F000 F000 F800 F801 FFFF FFFF FFFF
  1817.    dat 0000 0000 03FE 0203 FFC1 8001 FF81 0801
  1818.    dat 0F81 0801 0F81 0403 07FE 0000 0000 0000
  1819.    dat mouse hourglass 0007 0007
  1820.    dat 8003 0001 8003 8003 C007 E00F F01F F01F
  1821.    dat C007 C007 8003 8003 0001 8003 FFFF FFFF
  1822.    dat 0000 7FFC 2008 2808 1510 0AA0 0540 0440
  1823.    dat 0920 1010 2108 2288 7FFC 0000 0000 0000
  1824.    set videomode=12 ...which is the 640x480x16 color mode
  1825.    mouse cursor=GunSight
  1826.    mouse show
  1827.    int 16 ax=0000 is the BIOS wait for keypress function
  1828.    mouse hide
  1829.    mouse cursor=crosshair
  1830.    mouse show
  1831.    int 16 ax=0000
  1832.    mouse hide
  1833.    mouse cursor=downarrow
  1834.    mouse show
  1835.    int 16 ax=0000
  1836.    mouse hide
  1837.    mouse cursor=lefthand
  1838.    mouse show
  1839.    int 16 ax=0000
  1840.    mouse hide
  1841.    mouse cursor=hourglass
  1842.    mouse show
  1843.    int 16 ax=0000
  1844.    mouse hide
  1845.    end with 1
  1846.    eof
  1847.  
  1848.  This next example  file demonstrates a  few of the  functions of XYZ.
  1849.  Notice how small this file  compiles! How many compilers do  you know
  1850.  of that would  perform the same  functions as this  one in only  5885
  1851.  bytes? Enjoy...
  1852.  
  1853.    053 This is a demonstration file
  1854.    /// The compiled version of this file can be found
  1855.    /// under the name "sample.com" in this directory.
  1856.    dat txt sample.xyz=sample.xyz
  1857.    dat txt $tring=The sin of 2 = 
  1858.    dat txt error=File not found!
  1859.    dat num number=2
  1860.    /// Demonstrate graphics
  1861.    set videomode=12 which is the 640x480x16 color mode
  1862.    set wide=100
  1863.    set hite=200
  1864.    set color=0B 00 00 = bright blue
  1865.    set angle=-45 degrees
  1866.    set mode=0
  1867.    set col=320
  1868.    set row=240
  1869.    draw rotated ellipse
  1870.    set blank=3
  1871.    set dash1=3
  1872.    set dash2=6
  1873.    /// This sets row2=row...
  1874.    push row
  1875.    pop row2
  1876.    set col2=639
  1877.    draw line
  1878.    int 16 ax=0000 This interrupt will pause until a key is pressed
  1879.    set videomode=3 which is normal text mode
  1880.    /// Demonstrate math capability
  1881.    set color=0A 00 00 = bright green
  1882.    set start=1
  1883.    set size=20
  1884.    tty $tring
  1885.    sin number
  1886.    convert result to buffer
  1887.    tty buffer
  1888.    /// Demonstrate file command
  1889.    file open sample.xyz
  1890.    jer Error!
  1891.    /// I could have set up a Critical Error Handler instead of "jer"
  1892.    set size=27
  1893.    file read from handle to buffer
  1894.    set col=0
  1895.    set row=1
  1896.    set tty cursor
  1897.    tty buffer
  1898.    file reset handle
  1899.    set size=27
  1900.    file read from handle to buffer
  1901.    set mode=1
  1902.    set tty blink to enable a blinking cursor
  1903.    set col=0
  1904.    set row=2
  1905.    set color=8A 00 00 = blinking bright green
  1906.    set tty cursor
  1907.    tty buffer
  1908.    file close handle
  1909.    end with 0
  1910.    --- Error! ...the program will go here if sample.xyz not found.
  1911.    set size=16
  1912.    set mode=1
  1913.    set tty blink to enable a blinking cursor
  1914.    set color=8C 00 00 = blinking bright red
  1915.    tty error
  1916.    end with 255
  1917.    eof
  1918. ╔═════════════════════════════════════════════════════════════════════╗
  1919. ║ Becoming a registered user                                          ║
  1920. ╚═════════════════════════════════════════════════════════════════════╝
  1921.  If you have enjoyed  using XYZ, then you  are welcome to register  it
  1922.  for $30. This $30 will enable  you to use it to compile  and register
  1923.  your  own  programs  for  fun  or  profit.  Without this registration
  1924.  process, any programs you compile with it remain the property of  the
  1925.  owner(s) of the XYZ software application product. See the topic  "XYZ
  1926.  License Agreement" for more information.
  1927.  
  1928.  Please send your registration fee to:
  1929.  
  1930.    XYZ
  1931.    PO BOX #40943
  1932.    Tempe, AZ 85274
  1933.  
  1934.  Make check(s) payable to: Andrew Robinson
  1935.  
  1936.  Soon to be released are:
  1937.  
  1938.    * A 32-bit version of XYZ
  1939.    * An XYZ debugger for troubleshooting your compiled programs
  1940.    * A Windows95 compiler written as an XYZ application
  1941.  
  1942.  For Corporate registrations, the registration fee  will be $300.  For
  1943.  international corporate registrations,  the registration fee  will be
  1944.  $1000.
  1945.  
  1946.  Windows95 is a trademark of Microsoft Corp.
  1947. ╔═════════════════════════════════════════════════════════════════════╗
  1948. ║ APPENDIX:                                                           ║
  1949. ╚═════════════════════════════════════════════════════════════════════╝
  1950. ┌─────────────────────────────────────────────────────────────────────┐
  1951. │ Table of Scan Codes for 101/102-Key Keyboard (in hexadecimal):      │
  1952. └─────────────────────────────────────────────────────────────────────┘
  1953.  Main keyboard:
  1954.  ┌───┐┌──┬──┬──┬──┐┌──┬──┬──┬──┐┌──┬───┬───┬───┐┌───┬───┬───┐
  1955.  │Esc││F1│F2│F3│F4││F5│F6│F7│F8││F9│F10│F11│F12││Prt│Scl│Paw│
  1956.  │ 01││3B│3C│3D│3E││3F│40│41│42││43│ 44│ 57│ 58││   │ 57│   │
  1957.  └───┘└──┴──┴──┴──┘└──┴──┴──┴──┘└──┴───┴───┴───┘└───┴───┴───┘
  1958.  ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──────┐┌───┬───┬───┐
  1959.  │` │ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│ 0│ -│ =│──   ││Ins│Hom│PgU│
  1960.  │29│02│03│04│05│06│07│08│09│0A│0B│0C│0D│ 0E   ││*52│*47│*49│
  1961.  ├──┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─────┤├───┼───┼───┤
  1962.  │Tab│ Q│ W│ E│ R│ T│ Y│ U│ I│ O│ P│ [│ ]│     ││Del│End│PgD│
  1963.  │ 0F│10│11│12│13│14│15│16│17│18│19│1A│1B│     ││*53│*4F│*51│
  1964.  ├───┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┘     │└───┴───┴───┘
  1965.  │Caps│ A│ S│ D│ F│ G│ H│ J│ K│ L│ ;│ '│ ENTER │
  1966.  │ 3A │1E│1F│20│21│22│23│24│25│26│27│28│ 1C ─┘│
  1967.  ├────┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴────┬──┤┌───┐
  1968.  │Shift │ Z│ X│ C│ V│ B│ N│ M│ ,│ .│ /│Shift│\ ││  │
  1969.  │  2A  │2C│2D│2E│2F│30│31│32│33│34│35│  36 │2B││*48│
  1970.  ├────┬─┴┬─┴──┼──┴──┴──┴──┴──┴──┴┬─┴──┼───┬─┴──┤┌───┼───┼───┐
  1971.  │Ctrl│  │Alt │     Space Bar    │Alt │   │Ctrl││  │  │  │
  1972.  │ 1D │  │ 38 │        39        │*38 │   │*10 ││*4B│*50│*40│
  1973.  └────┘  └────┴──────────────────┴────┘   └────┘└───┴───┴───┘
  1974.  
  1975.  Numeric keypad:
  1976.  ┌───┬───┬───┬───┐
  1977.  │Num│ / │ * │ - │
  1978.  │ 45│*36│ 37│ 4A│
  1979.  ├───┼───┼───┼───┤
  1980.  │ 7 │ 8 │ 9 │   │
  1981.  │ 47│ 48│ 49│ + │
  1982.  ├───┼───┼───┤ 4E│
  1983.  │ 4 │ 5 │ 6 │   │
  1984.  │ 4B│ 4C│4D │   │
  1985.  ├───┼───┼───┼───┤
  1986.  │ 1 │ 2 │ 3 │   │
  1987.  │ 4F│ 50│ 51│─┘│  Notes:
  1988.  ├───┴───┼───┤*1C│  * = E0
  1989.  │  Ins  │Del│   │  Prt = E0 2A E0 37
  1990.  │   52  │ 53│   │  Paw (pause) = E0 10 45
  1991.  └───────┴───┴───┘  Scan Codes for 84 or 83-Key Keyboards are the same.
  1992.  
  1993. ┌─────────────────────────────────────────────────────────────────────┐
  1994. │ Table of video modes and their default colors:                      │
  1995. └─────────────────────────────────────────────────────────────────────┘
  1996.  
  1997.  For sixteen color video/text modes:
  1998.  
  1999.  ┌──────────────────┬──────────────────┐
  2000.  │ Background   Hex │Foreground   Hex  │
  2001.  │ Color       Value│ Color      Value │
  2002.  ├──────────────────┼──────────────────┤
  2003.  │ Black         0  │ Black         0  │
  2004.  │ Blue          1  │ Blue          1  │
  2005.  │ Green         2  │ Green         2  │
  2006.  │ Cyan          3  │ Cyan          3  │
  2007.  │ Red           4  │ Red           4  │
  2008.  │ Magenta       5  │ Magenta       5  │
  2009.  │ Brown         6  │ Brown         6  │
  2010.  │ White         7  │ White         7  │
  2011.  │ Black blink   8  │ Dark gray     8  │
  2012.  │ Blue blink    9  │ Light blue    9  │
  2013.  │ Green blink   A  │ Light green   A  │
  2014.  │ Cyan blink    B  │ Light cyan    B  │
  2015.  │ Red blink     C  │ Light red     C  │
  2016.  │ Magenta blink D  │ Light magenta D  │
  2017.  │ Brown blink   E  │ Yellow        E  │
  2018.  │ White blink   F  │ Bright white  F  │
  2019.  └──────────────────┴──────────────────┘
  2020.  
  2021.  Some sample colors for the 16.8M color modes:
  2022.  
  2023.  Black     = 00 00 00
  2024.  Blue      = 00 00 FF
  2025.  Brown     = 7F 29 29
  2026.  Chocolate = D1 69 1E
  2027.  Cyan      = 00 FF FF
  2028.  Flesh     = FF 7D 40
  2029.  Gold      = FF D7 00
  2030.  Green     = 00 64 00
  2031.  Grey      = 6F 6F 6F
  2032.  Hotpink   = FF 6A 64
  2033.  Indigo    = 08 2E 54
  2034.  Ivory     = FF FF F0
  2035.  Lightgrey = D3 D3 D3
  2036.  Magenta   = FF 00 FF
  2037.  Maroon    = 60 2F 60
  2038.  Olive     = 3B 5E 2B
  2039.  Orange    = FF 80 00
  2040.  Purple    = A0 20 F0
  2041.  Red       = FF 00 00
  2042.  Skyblue   = 87 CE FA
  2043.  Tan       = D2 64 8C
  2044.  Turquoise = 40 E0 D0
  2045.  Violet    = 8E 5E 99
  2046.  White     = FF FF FF
  2047.  Yellow    = FF FF 00
  2048.  
  2049. ┌─────────────────────────────────────────────────────────────────────┐
  2050. │ Table of ASCII codes:                                               │
  2051. └─────────────────────────────────────────────────────────────────────┘
  2052.  
  2053.    ┌───────────────────────────────────────────────────────────────┐
  2054.    │  0 Nul   32 BL   64 @    96 `   128 Ç   160 á   192 └   224 α │
  2055.    │  1      33 !    65 A    97 a   129 ü   161 í   193 ┴   225 ß │
  2056.    │  2      34 "    66 B    98 b   130 é   162 ó   194 ┬   226 Γ │
  2057.    │  3      35 #    67 C    99 c   131 â   163 ú   195 ├   227 π │
  2058.    │  4      36 $    68 D   100 d   132 ä   164 ñ   196 ─   228 Σ │
  2059.    │  5      37 %    69 E   101 e   133 à   165 Ñ   197 ┼   229 σ │
  2060.    │  6      38 &    70 F   102 f   134 å   166 ª   198 ╞   230 µ │
  2061.    │  7      39 '    71 G   103 g   135 ç   167 º   199 ╟   231 τ │
  2062.    │  8      40 (    72 H   104 h   136 ê   168 ¿   200 ╚   232 Φ │
  2063.    │  9 TAB   41 )    73 I   105 i   137 ë   169 ⌐   201 ╔   233 Θ │
  2064.    │ 10 LF    42 *    74 J   106 j   138 è   170 ¬   202 ╩   234 Ω │
  2065.    │ 11       43 +    75 K   107 k   139 ï   171 ½   203 ╦   235 δ │
  2066.    │ 12 FF    44 ,    76 L   108 l   140 î   172 ¼   204 ╠   236 ∞ │
  2067.    │ 13 CR    45 -    77 M   109 m   141 ì   173 ¡   205 ═   237 φ │
  2068.    │ 14      46 .    78 N   110 n   142 Ä   174 «   206 ╬   238 ε │
  2069.    │ 15      47 /    79 O   111 o   143 Å   175 »   207 ╧   239 ∩ │
  2070.    │ 16      48 0    80 P   112 p   144 É   176 ░   208 ╨   240 ≡ │
  2071.    │ 17      49 1    81 Q   113 q   145 æ   177 ▒   209 ╤   241 ± │
  2072.    │ 18      50 2    82 R   114 r   146 Æ   178 ▓   210 ╥   242 ≥ │
  2073.    │ 19      51 3    83 S   115 s   147 ô   179 │   211 ╙   243 ≤ │
  2074.    │ 20      52 4    84 T   116 t   148 ö   180 ┤   212 ╘   244 ⌠ │
  2075.    │ 21      53 5    85 U   117 u   149 ò   181 ╡   213 ╒   245 ⌡ │
  2076.    │ 22      54 6    86 V   118 v   150 û   182 ╢   214 ╓   246 ÷ │
  2077.    │ 23      55 7    87 W   119 w   151 ù   183 ╖   215 ╫   247 ≈ │
  2078.    │ 24      56 8    88 X   120 x   152 ÿ   184 ╕   216 ╪   248 ° │
  2079.    │ 25      57 9    89 Y   121 y   153 Ö   185 ╣   217 ┘   249 ∙ │
  2080.    │ 26      58 :    90 Z   122 z   154 Ü   186 ║   218 ┌   250 · │
  2081.    │ 27      59 ;    91 [   123 {   155 ¢   187 ╗   219 █   251 √ │
  2082.    │ 28      60 <    92 \   124 |   156 £   188 ╝   220 ▄   252 ⁿ │
  2083.    │ 29      61 =    93 ]   125 }   157 ¥   189 ╜   221 ▌   253 ² │
  2084.    │ 30      62 >    94 ^   126 ~   158 ₧   190 ╛   222 ▐   254 ■ │
  2085.    │ 31      63 ?    95 _   127    159 ƒ   191 ┐   223 ▀   255 BL│
  2086.    └───────────────────────────────────────────────────────────────┘
  2087.  
  2088.  Notes:
  2089.  All codes are in decimal.
  2090.  BL = Blank
  2091.  LF = line feed (goto next line)
  2092.  FF = form feed (goto next page)
  2093.  CR = carriage return (goto first char on current line)
  2094.  TAB = goto next tab stop
  2095.  
  2096. ┌─────────────────────────────────────────────────────────────────────┐
  2097. │ List of some common DOS 21h interrupts:                             │
  2098. └─────────────────────────────────────────────────────────────────────┘
  2099.  Auxiliary input
  2100.    Call with: AX=0300h
  2101.    Returns  : AL=ASCII code for character
  2102.  ----------------------------------------------------------------------
  2103.  Auxiliary output
  2104.    Call with: AX=0400h
  2105.               DL=ASCII code for character
  2106.  ----------------------------------------------------------------------
  2107.  Character input with buffer
  2108.    Call with: AX=0A00h
  2109.               DS:DX=segment:offset of buffer
  2110.  ----------------------------------------------------------------------
  2111.  Character input without buffer (clears buffer)
  2112.    Call with: AX=0C01h or
  2113.               AX=0C06h or
  2114.               AX=0C07h or
  2115.               AX=0C08h or
  2116.               AX=0C0Ah
  2117.    Returns  : If AL not=0C0Ah
  2118.                 AL=ASCII code for character
  2119.               If AL=0C0Ah
  2120.                 DS:DX=segment:offset of input buffer
  2121.  ----------------------------------------------------------------------
  2122.  Character input with echo
  2123.    Call with: AX=0100h
  2124.    Returns  : AL=ASCII code for character
  2125.  ----------------------------------------------------------------------
  2126.  Character input without echo (unfiltered)
  2127.    Call with: AX=0700h
  2128.    Returns  : AL=ASCII code for character
  2129.  ----------------------------------------------------------------------
  2130.  Character input without echo
  2131.    Call with: AX=0800h
  2132.    Returns  : AL=ASCII code for character
  2133.  ----------------------------------------------------------------------
  2134.  Character output
  2135.    Call with: AX=0200h
  2136.               DL=ASCII code for character
  2137.  ----------------------------------------------------------------------
  2138.  Character string, Output
  2139.    Call with: AX=0900h
  2140.               DS:DX=segment:offset of string
  2141.  ----------------------------------------------------------------------
  2142.  Check input status
  2143.    Call with: AX=0B00h
  2144.    Returns  : If no character is available AL=00h
  2145.               If at least one character is available AL=FFh
  2146.  ----------------------------------------------------------------------
  2147.  Create new Program Segment Prefix (PSP)
  2148.    Call with: AX=2600h
  2149.    Returns  : DX=Segment of new program segment prefix
  2150.  ----------------------------------------------------------------------
  2151.  Direct console I/O
  2152.    Call with: AX=0600h
  2153.               DX=0000h-00FEh (if output request)
  2154.               DX=00FFh (if input request)
  2155.    Returns  : If called with DL=00FFh and a character is ready:
  2156.                 Zero flag=clear
  2157.                 AL=ASCII code for character
  2158.               If called with DL=00FFh and no character is ready
  2159.                 Zero flag=set
  2160.  ----------------------------------------------------------------------
  2161.  Disk, Get allocation information about
  2162.    Call with: AX=3600h
  2163.               DX=Drive code (0000=default, 0001=A,...)
  2164.    Returns  : If drive valid...
  2165.                 AX=Sectors per cluster
  2166.                 BX=Number of available clusters
  2167.                 CX=Bytes per sector
  2168.                 DX=Clusters per drive
  2169.               If drive invalid AX=FFFFh
  2170.  ----------------------------------------------------------------------
  2171.  Disk, Get current
  2172.    Call with: AX=1900h
  2173.    Returns  : AL=Drive code (0=A, 1=B,...)
  2174.  ----------------------------------------------------------------------
  2175.  Disk, Get data on
  2176.    Call with: AX=1B00h for default drive
  2177.    Returns  : If invalid drive or critical error AL=FFh
  2178.               Else AL=Sectors per cluster
  2179.                    DS:BX=segment:offset of media ID byte
  2180.                    CX=Size of physical sector (bytes)
  2181.                    DX=Number of clusters for default drive
  2182.  ----------------------------------------------------------------------
  2183.  Disk, Read sector from (Interrupt 25h, ignoring logical structure)
  2184.    Call with: AX=Drive number (0000=A, 0001=B,...)
  2185.               DX=Starting sector number
  2186.               If partitions <= 32 megabytes
  2187.                 CX=Number of sectors to read and
  2188.                 DS:BX=segment:offset of buffer
  2189.               If partitions > 32 megabytes [Version 4.0+]
  2190.                 CX=-1 and
  2191.                 DS:BX=segment:offset of parameter block
  2192.    Returns  : If function successful Carryflag=clear
  2193.               If function unsuccessful
  2194.                 Carry flag=set
  2195.                 AX=Error code
  2196.  ----------------------------------------------------------------------
  2197.  Disk, Reset
  2198.    Call with: AX=0D00h
  2199.  ----------------------------------------------------------------------
  2200.  Disk, Select
  2201.    Call with: AH=0Eh
  2202.               AL=Number of logical drives in system
  2203.               DX=Drive code (0000=A, 0001=B,...)
  2204.  ----------------------------------------------------------------------
  2205.  Disk, Write sector to (Interrupt 26h, ignoring logical structure)
  2206.    Call with: AX=Drive number (0000=A, 0001=B,...)
  2207.               DX=Starting sector number
  2208.               If partitions <= 32 megabytes
  2209.                 CX=Number of sectors to write and
  2210.                 DS:BX=segment:offset of buffer
  2211.               If partitions > 32 megabytes [Version 4.0+]
  2212.                 CX=-1 and
  2213.                 DS:BX=segment:offset of parameter block
  2214.    Returns  : If function successful Carryflag=clear
  2215.               If function unsuccessful
  2216.                 Carryflag=set
  2217.                 AX=Error code
  2218.  ----------------------------------------------------------------------
  2219.  Duplicate handle
  2220.    Call with: AX=4500h
  2221.               BX=Handle to be duplicated
  2222.    Returns  : If duplicated
  2223.                 Carry flag=clear
  2224.                 AX=New handle
  2225.               If not
  2226.                 Carry flag=set
  2227.                 AX=04h or 06h Error code
  2228.  ----------------------------------------------------------------------
  2229.  Execute program
  2230.    Call with: AX=4B00h to load and execute program
  2231.               AX=4B03h to load overlay
  2232.               DS:DX=segment:offset of program specification
  2233.    Returns  : If program executed Carry flag=clear upon return
  2234.                 Note: CS:IP must be preserved
  2235.               If not
  2236.                 Carry flag=set
  2237.                 AX=01h, 02h, 03h, 05h, 08h, 0Ah, or 0Bh Error codes
  2238.  ----------------------------------------------------------------------
  2239.  File directory, Create
  2240.    Call with: AX=3900h
  2241.               DS:DX=segment:offset of ASCIIZ path name
  2242.    Returns  : If directory created Carry flag=clear
  2243.               If directory not created
  2244.                 Carry flag=set
  2245.                 AX=0003h or 0005h Error code
  2246.  ----------------------------------------------------------------------
  2247.  File directory, delete
  2248.    Call with: AX=3A00h
  2249.               DS:DX=segment:offset of ASCIIZ path name
  2250.    Returns  : If directory deleted Carry flag=clear
  2251.               If directory not deleted
  2252.                 Carry flag=set
  2253.                 AX=03h, 05h, or 10h Error code
  2254.  ----------------------------------------------------------------------
  2255.  File directory, Find first file in
  2256.    Call with: AX=4E00h
  2257.               CX=Attribute to use in search
  2258.                    1  =Read-only
  2259.                    2  =Hidden
  2260.                    4  =System
  2261.                    8  =Volume label
  2262.                    10h=Directory
  2263.                    20h=Archive
  2264.               DS:DX=segment:offset of ASCIIZ path name
  2265.    Returns  : If first file found
  2266.                 Carry flag=clear
  2267.                 Disk transfer area (DTA) will be filled in as follows:
  2268.                   Byte# 00h-14h=0 (Reserved)
  2269.                   Byte# 15h=Attribute of matched file or directory
  2270.                   Byte# 16h-17h=Packed file time
  2271.                   Byte# 18h-19h=Packed file date
  2272.                   Byte# 1Ah-1Dh=File size
  2273.                   Byte# 1Eh-2Ah=ASCIIZ filename
  2274.               If not
  2275.                 Carry flag=set
  2276.                 AX=02h, 03h, or 12h Error codes
  2277.  ----------------------------------------------------------------------
  2278.  File directory, Find next file in
  2279.    Call with: AX=4F00h
  2280.               Assumes previous call to Int 21 Function 4Eh or 4Fh
  2281.    Returns  : If next file found
  2282.                 Carry flag=clear
  2283.                 DTA filled in
  2284.               If not
  2285.                 Carry flag=set
  2286.                 AX=12h Error code
  2287.    Note     : Disk transfer area (DTA) will be filled in as follows...
  2288.                 Byte# 00h-14h=0 (Reserved)
  2289.                 Byte# 15h=Attribute of matched file or directory
  2290.                 Byte# 16h-17h=Packed file time
  2291.                 Byte# 18h-19h=Packed file date
  2292.                 Byte# 1Ah-1Dh=File size
  2293.                 Byte# 1Eh-2Ah=ASCIIZ filename
  2294.  ----------------------------------------------------------------------
  2295.  File directory, Get current
  2296.    Call with: AX=4700h
  2297.               DX=Drive code (000=default, 0001=A,...)
  2298.               DS:SI=segment:offset of 64-byte buffer
  2299.    Returns  : If successful
  2300.                 Carry flag=clear
  2301.                 buffer is filled in with full path name
  2302.               If not
  2303.                 Carry flag=set
  2304.                 AX=0Fh Error code
  2305.  ----------------------------------------------------------------------
  2306.  File directory, Set current
  2307.    Call with: AX=3B00h
  2308.               DS:DX=segment:offset of ASCIIZ path name
  2309.    Returns  : If successful Carry flag=clear
  2310.               If unsuccessful
  2311.                 Carry flag=set
  2312.                 AX=3 Error code
  2313.  ----------------------------------------------------------------------
  2314.  File, Close
  2315.    Call with: AX=3E00h
  2316.               BX=Handle
  2317.    Returns  : If file closed Carry flag=clear
  2318.               If file still open
  2319.                 Carry flay=set
  2320.                 AX=06h Error code
  2321.  ----------------------------------------------------------------------
  2322.  File, Commit (forces buffer to be written out)
  2323.    Call with: AX=6800h
  2324.               BX=Handle
  2325.    Returns  : If file commited Carry flag=clear
  2326.               If not
  2327.                 Carry flag=set
  2328.                 AX=Error code
  2329.  ----------------------------------------------------------------------
  2330.  File, Create
  2331.    Call with: AX=3C00h
  2332.               CX=File attribute...
  2333.                    1  =Read-only
  2334.                    2  =Hidden
  2335.                    4  =System
  2336.                    8  =Volume label
  2337.                    20h=Archive
  2338.               DS:DX=segment:offset of ASCIIZ path name
  2339.    Returns  : If file created
  2340.                 Carry flag=clear
  2341.                 AX=Handle
  2342.               If file not created
  2343.                 Carry flag=set
  2344.                 AX=3, 4, or 5 Error code
  2345.  ----------------------------------------------------------------------
  2346.  File, Create temporary
  2347.    Call with: AX=5A00h
  2348.               CX=Attribute
  2349.                    1  =Read-only
  2350.                    2  =Hidden
  2351.                    4  =System
  2352.                    8  =Volume label
  2353.                    20h=Archive
  2354.               DS:DX=segment:offset of ASCIIZ path name
  2355.    Returns  : If file created
  2356.                 Carry flag=clear
  2357.                 AX=Handle
  2358.                 DS:DX=segment:offset of complete ASCIIZ path name
  2359.               If not
  2360.                 AX=03h, 04h, or 05h Error codes
  2361.  ----------------------------------------------------------------------
  2362.  File, Create new
  2363.    Call with: AX=5B00h
  2364.               CX=Attribute
  2365.                    1  =Read-only
  2366.                    2  =Hidden
  2367.                    4  =System
  2368.                    8  =Volume label
  2369.                    20h=Archive
  2370.               DS:DX=segment:offset of ASCIIZ path name
  2371.    Returns  : If file created
  2372.                 Carry flag=clear
  2373.                 AX=Handle
  2374.                 DS:DX=segment:offset of complete ASCIIZ path name
  2375.               If not
  2376.                 AX=03h, 04h, 05h, or 50h Error codes
  2377.  ----------------------------------------------------------------------
  2378.  File, Delete
  2379.    Call with: AX=4100h
  2380.               DS:DX=segment:offset of ASCIIZ path name
  2381.    Returns  : If deleted Carry flag=clear
  2382.               If not deleted
  2383.                 Carry flag=set
  2384.                 AX=02h, 03h, or 05h Error code
  2385.  ----------------------------------------------------------------------
  2386.  File, Extended open, create, or replace File for DOS Version 4.0+
  2387.    Call with: AH=6C00h
  2388.               BX=Open mode
  2389.                    Access type...
  2390.                      0=read-only
  2391.                      1=write-only
  2392.                      2=read/write
  2393.                    Sharing mode...
  2394.                      0  =compatibility
  2395.                      10h=deny read/write
  2396.                      20h=deny write
  2397.                      30h=deny read
  2398.                      40h=deny none
  2399.                    Inheritance...
  2400.                      0  =child process inherits handle
  2401.                      80h=child does not inherit handle
  2402.                    Critical error handling...
  2403.                      0    =execute Int 24h
  2404.                      2000h=return error to process
  2405.                    Write-through...
  2406.                      0    =writes may be buffered and deferred
  2407.                      4000h=physical write at request time
  2408.               CX=File attribute
  2409.                    1  =read-only
  2410.                    2  =hidden
  2411.                    4  =system
  2412.                    8  =volume label
  2413.                    20h=archive
  2414.               DX=Open flag
  2415.                    Action if file exists...
  2416.                      0=fail
  2417.                      1=open file
  2418.                      2=replace file
  2419.                    Action if file doesn't exist...
  2420.                      0=fail
  2421.                      80h=create file
  2422.               DS:SI=segment:offset of ASCIIZ path name
  2423.    Returns  : If function successful
  2424.                 Carry flag=clear
  2425.                 AX=Handle
  2426.                 CX=Action taken
  2427.                      1=File existed and was opened
  2428.                      2=File did not exist and was created
  2429.               If function unsuccessful
  2430.                 Carry flag=set
  2431.                 AX=Error code
  2432.  ----------------------------------------------------------------------
  2433.  File, Get or set attributes of
  2434.    Call with: AX=4300h if getting file attribute
  2435.               AX=4301h if setting file attribute
  2436.               CX=New file attribute if AL=01h
  2437.                    1  =Read-only
  2438.                    2  =Hidden
  2439.                    4  =System
  2440.                    20h=Archive
  2441.               DS:DX=segment:offset of ASCIIZ path name
  2442.    Returns  : If file attribute set
  2443.                 Carry flag=clear
  2444.                 CX=File attribute
  2445.               If file attribute not set
  2446.                 Carry flag=set
  2447.                 AX=01h, 02h, 03h, or 05h Error code
  2448.  ----------------------------------------------------------------------
  2449.  File, Get or set date and time of
  2450.    Call with: If getting date and time
  2451.                 AX=5700h
  2452.                 BX=Handle
  2453.               If setting date and time
  2454.                 AX=5701h
  2455.                 BX=Handle
  2456.                 CX=Time
  2457.                      Bits 0Bh-0Fh=hours (0-23)
  2458.                      Bits 05h-0AH=minutes (0-59)
  2459.                      Bits 00h-04h=2-second increments (0-29)
  2460.                 DX=Date
  2461.                      Bits 09h-0Fh=year (relative to 1980)
  2462.                      Bits 05h-08h=month (1-12)
  2463.                      Bits 00h-04h=day (1-31)
  2464.    Returns  : If date and time set or got
  2465.                 Carry flag=clear
  2466.                 CX=Time
  2467.                 DX=Date
  2468.               If not
  2469.                 Carry flag=set
  2470.                 AX=01h or 06h Error codes
  2471.  ----------------------------------------------------------------------
  2472.  File, Lock or unlock region of
  2473.    Call with: AX=5C00h if locking region
  2474.               AX=5C01h if unlocking region
  2475.               BX=Handle
  2476.               CX=High part of region offset
  2477.               DX=Low part of region offset
  2478.               SI=High part of region length
  2479.               DI=Low part of region length
  2480.    Returns  : If file created
  2481.                   Carry flag=clear
  2482.               If not
  2483.                 Carry flag=set
  2484.                 AX=01h, 06h, 21h, or 24h Error codes
  2485.  ----------------------------------------------------------------------
  2486.  File, Open
  2487.    Call with: AH=3Dh
  2488.               AL=Access mode...
  2489.                    0=read access
  2490.                    1=write access
  2491.                    2=read/write access
  2492.                  Sharing mode...
  2493.                    0  =compatibility mode
  2494.                    10h=deny all
  2495.                    20h=deny write
  2496.                    30h=deny read
  2497.                    40h=deny none
  2498.                  Inheritance flag...
  2499.                    0  =Child process inherits handle
  2500.                    80h=Child does not inherit handle
  2501.               DS:DX=segment:offset of ASCIIZ path name
  2502.    Returns  : If file opened
  2503.                 Carry flag=clear
  2504.                 AX=Handle
  2505.               If file unopened
  2506.                 Carry flag=set
  2507.                 AX=2, 3, 4, 5, or 0Ch Error code
  2508.  ----------------------------------------------------------------------
  2509.  File, Rename
  2510.    Call with: AX=5600h
  2511.               DS:DX=segment:offset of current ASCIIZ path name
  2512.               ES:DI=segment:offset of new ASCIIZ path name
  2513.    Returns  : If file renamed Carry flag=clear
  2514.               If not
  2515.                 Carry flag=set
  2516.                 AX=02h, 03h, 05h, or 11h Error codes
  2517.  ----------------------------------------------------------------------
  2518.  File, Set handle count (sets maximum number of files)
  2519.    Call with: AX=6700h
  2520.               BX=Number of desired handles
  2521.    Returns  : If handle count set Carry flag=clear
  2522.               If not
  2523.                 Carry flag=set
  2524.                 AX=Error code
  2525.  ----------------------------------------------------------------------
  2526.  File, Set location of pointer in
  2527.    Call with: AX=4200h Absolute offset from start of file
  2528.               AX=4201h Signed offset from current file pointer
  2529.               AX=4202h Signed offset from end of file
  2530.               BX=Handle
  2531.               CX=Most significant half of offset to move
  2532.               DX=Least significant half of offset to move
  2533.    Returns  : If file pointer set
  2534.                 Carry flag=clear
  2535.                 AX=Least significant half of resulting file pointer
  2536.                 DX=Most significant half of resulting file pointer
  2537.               If file pointer not set
  2538.                 Carry flag=set
  2539.                 AX=01h or 06h Error code
  2540.  ----------------------------------------------------------------------
  2541.  File or device, Read from
  2542.    Call with: AX=3F00h
  2543.               BX=Handle
  2544.               CX=Number of bytes to read
  2545.               DS:DX=segment:offset of buffer
  2546.    Returns  : If read
  2547.                 Carry flag=clear
  2548.                 AX=Number of bytes read
  2549.               If not read
  2550.                 Carry flag=set
  2551.                 AX=05h or 06h Error code
  2552.  ----------------------------------------------------------------------
  2553.  File or device, Write to
  2554.    Call with: AX=4000h
  2555.               BX=Handle
  2556.               CX=Number of bytes to write
  2557.               DS:DX=segment:offset of buffer
  2558.    Returns  : If written
  2559.                 Carry flag=clear
  2560.                 AX=Number of bytes written
  2561.               If not written
  2562.                 Carry flag=set
  2563.                 AX=05h or 06h Error code
  2564.  ----------------------------------------------------------------------
  2565.  Get Data Transfer Area (DTA) address
  2566.    Call with: AX=2F00h
  2567.    Returns  : ES:BX=segment:offset of DTA
  2568.  ----------------------------------------------------------------------
  2569.  Get Date
  2570.    Call with: AX=2A00h
  2571.    Returns  : CX=Year (1980 through 2099)
  2572.               DH=Month (1 through 12)
  2573.               DL=Day (1 through 31)
  2574.               AL=Day of the week (0=Sunday, 1=Monday,...)
  2575.  ----------------------------------------------------------------------
  2576.  Get Extended Country Information
  2577.    Call with: AX=6502h to get pointer to Uppercase Table
  2578.               AX=6504h to get pointer to Filename Uppercase Table
  2579.               AX=6506h to get pointer to Collating Table
  2580.               AX=6507h to get pointer to DBCS Vector [Version 4.0+]
  2581.               BX=Code page of interest (-1=active CON device)
  2582.               CX=Length of buffer to receive information
  2583.               DX=Country ID (-1=default)
  2584.               ES:DI=Address of buffer to receive information
  2585.    Returns  : If file created
  2586.                 Carry flag=clear
  2587.               If not
  2588.                 Carry flag=set
  2589.                 AX=02h Error code
  2590.  ----------------------------------------------------------------------
  2591.  Get Extended Error Information
  2592.    Call with: AH=59h
  2593.               BX=00h
  2594.    Returns  : AX=Extended error code
  2595.               BH=Error class...
  2596.                    01h Out of storage or handles
  2597.                    02h Temporary error (such as locked region in
  2598.                        file) that can be expected to end)
  2599.                    03h Authorization problem
  2600.                    04h Internal error in system software
  2601.                    05h Hardware failure
  2602.                    06h System software failure (such as missing
  2603.                        configuration files)
  2604.                    07h Application program error
  2605.                    08h File or item not found
  2606.                    09h File or item of invalid type or format
  2607.                    0Ah File or item locked
  2608.                    0Bh Wrong disk in drive, bad spot on disk, or
  2609.                        storage medium problem
  2610.                    0Ch Unknown error
  2611.               BL=Recommended action...
  2612.                    01h Retry reasonable number of times, then prompt
  2613.                        user to select abort or ignore
  2614.                    02h Retry reasonable number of times with delay
  2615.                        between retries, then prompt user to select
  2616.                        abort or ignore
  2617.                    03h Get corrected information from user caused by
  2618.                        incorrect filename or drive specification
  2619.                    04h Abort application and by terminating the
  2620.                        program, releasing locks, closing files,...
  2621.                    05h Abort application.
  2622.                    06h Ignore error
  2623.                    07h Retry after user intervention to remove cause
  2624.                        of error
  2625.               CH=Error locus...
  2626.                    01h Unknown
  2627.                    02h Block device
  2628.                    03h Network
  2629.                    04h Serial device
  2630.                    05h Memory
  2631.               ES:DI=ASCIIZ volume label of disk to insert, if
  2632.                    AX=0022h (invalid disk change)
  2633.  ----------------------------------------------------------------------
  2634.  Get Interrupt Vector
  2635.    Call with: AX=3500h
  2636.               AL=Interrupt number
  2637.    Returns  : ES:BX=segment:offset of interrupt handler
  2638.  ----------------------------------------------------------------------
  2639.  Get DOS Version Number
  2640.    Call with: AX=3000h
  2641.    Returns  : AL=Major version number
  2642.               AH=Minor version number
  2643.  ----------------------------------------------------------------------
  2644.  Get Program Segment Prefix (PSP) Address
  2645.    Call with: AX=6200h
  2646.    Returns  : BX=Segment address of PSP
  2647.  ----------------------------------------------------------------------
  2648.  Get Return Code
  2649.    Call with: AX=4D00h
  2650.    Returns  : AH=00h if normal termination by Int 20h, Int 21h
  2651.                    Function 0, or Int 21h Function 4Ch
  2652.               AH=02h if termination by critical-error handler
  2653.               AH=03h if termination by Int 21h Function 31h or
  2654.                    Int 27h
  2655.               AL=Return code passed by child process...0 if child
  2656.                    terminated by Int 20h, Int 21h Function 00h, or
  2657.                    Int 27h
  2658.  ----------------------------------------------------------------------
  2659.  Get Time
  2660.    Call with: AX=2C00h
  2661.    Returns  : CH=Hour (0 through 23)
  2662.               CL=Minute (0 through 59)
  2663.               DH=Second (0 through 59)
  2664.               DL=Hundredths of a second (0 through 99)
  2665.  ----------------------------------------------------------------------
  2666.  Get Verify Flag
  2667.    Call with: AX=5400h
  2668.    Returns  : AL=00h if verify OFF
  2669.               AL=01h if verify ON
  2670.  ----------------------------------------------------------------------
  2671.  Get address of InDOS Flag
  2672.    Call with: AX=3400h
  2673.    Returns  : ES:BX=Address of InDos flag
  2674.  ----------------------------------------------------------------------
  2675.  Get or Set Allocation Strategy
  2676.    Call with: If getting strategy code
  2677.                 AX=5800h
  2678.               If setting strategy code
  2679.                 AX=5801h
  2680.                 BX=00h for First fit
  2681.                 BX=01h for Best fit
  2682.                 BX=02h for Last fit
  2683.    Returns  : If allocation strategy set or got
  2684.                 Carry flag=clear
  2685.                 AX=00h for First fit
  2686.                 AX=01h for Best fit
  2687.                 AX=02h for Last fit
  2688.               If not
  2689.                 Carry flag=set
  2690.                 AX=01h Error code
  2691.  ----------------------------------------------------------------------
  2692.  Get or Set Break Flag
  2693.    Call with: AX=3300h if getting Break flag status
  2694.               AX=3301h if setting Break flag status
  2695.    Returns  : If the Break flag is off DL=00h
  2696.               If the Break flag is on  DL=01h
  2697.               If setting Break flag returns nothing
  2698.  ----------------------------------------------------------------------
  2699.  Get or Set Code Page
  2700.    Call with: AX=6601h to get code page
  2701.               AX=6602h to select code page
  2702.               If AX=6602h
  2703.                 BX=Code page to select
  2704.    Returns  : If code page set or got
  2705.                 Carry flag=clear
  2706.                 If also called with AL=01h
  2707.                   BX=Active code page
  2708.                   DX=Default code page
  2709.               If not
  2710.                 Carry flag=set
  2711.                 AX=02h or 65h Error codes
  2712.  ----------------------------------------------------------------------
  2713.  Get or Set Country Information
  2714.    Call with: If getting internationalization information...
  2715.                 To get current country information
  2716.                   AX=3800h
  2717.                 To get information if country code < 255
  2718.                   AX=3801-38FEh
  2719.                 To get information if country code >= 255
  2720.                   AX=38FFh
  2721.                 BX=Country code if AL=FFh
  2722.                 DS:DX=segment:offset of buffer for returned info
  2723.               If setting current country code...
  2724.                 AX=3801-38FEh if country code < 255
  2725.                 AX=38FFh if country code >= 255
  2726.                 BX=Country code if AX=38FFh
  2727.                 DX=FFFFh
  2728.    Returns  : If getting internationalization information...
  2729.               If call successful
  2730.                 Carry flag=clear
  2731.                 BX=Country code
  2732.                 The buffer is filled in as follows:
  2733.                   Byte# 00h-01h=Date format...
  2734.                     Bit 0=USA month/day/year
  2735.                     Bit 1=Europe day/month/year
  2736.                     Bit 2=Japan year/month/day
  2737.                   Byte# 02h-06h=ASCIIZ currency symbol
  2738.                   Byte# 07h-08h=ASCIIZ thousands separator
  2739.                   Byte# 09h-0Ah=ASCIIZ decimal separator
  2740.                   Byte# 0Bh-0Ch=ASCIIZ date separator
  2741.                   Byte# 0Dh-0Eh=ASCIIZ time separator
  2742.                   Byte# 0Fh Currency format...
  2743.                     Bit 0=0 if currency value follows symbol
  2744.                     Bit 0=1 if currency symbol follows value
  2745.                     Bit 1=0 if no space between value and
  2746.                             currency symbol
  2747.                     Bit 1=1 if one space between value and
  2748.                             currency symbol
  2749.                     Bit 2=0 if currency symbol and decimal
  2750.                             are seperate
  2751.                     Bit 2=1 if currency symbol replaces
  2752.                             decimal seperator
  2753.                   Byte# 10h=Number of digits after decimal in
  2754.                               currency
  2755.                   Byte# 11h=Time format...
  2756.                     Bit 0=0 if 12-hour time
  2757.                     Bit 0=1 if 24-hour time
  2758.                   Byte# 12h-15h=Case-map call address
  2759.                   Byte# 16h-17h=ASCIIZ data-list separator
  2760.                   Byte# 18h-21h=Reserved
  2761.               If call unsuccessful
  2762.                 Carry flag is set
  2763.                 AX=0002h Error code
  2764.  ----------------------------------------------------------------------
  2765.  IOCTL (I/2609ntrol):
  2766.  *Get Device Information
  2767.               AX=4400h
  2768.               BX=Handle
  2769.               If function successful Carry flag: clear
  2770.               DX=Device information word for a file...
  2771.                    Bits 0-5 =drive number (0=A, 1=B,...)
  2772.                    Bit  6   =0 (file has been written)
  2773.                             =1 (file has not been written)
  2774.                    Bit  7   =0 (indicating a file)
  2775.                    Bits 8-15=0 (reserved)
  2776.                  Device information for a device...
  2777.                    Bit 0    =1 (if console input)
  2778.                    Bit 1    =1 (if console output)
  2779.                    Bit 2    =1 (if NUL device)
  2780.                    Bit 3    =1 (if clock device)
  2781.                    Bit 4    =reserved
  2782.                    Bit 5    =0 (if handle in ASCII mode)
  2783.                             =1 (if handle in binary mode)
  2784.                    Bit 6    =0 (if end of file on input)
  2785.                    Bit 7    =1 (indicating a device)
  2786.                    Bits 8-13=reserved
  2787.                    Bit 14   =1 (if device supports IOCTL Read
  2788.                                and  Write Control Data subfunctions)
  2789.                             =0 (if Control Data subfunctions not
  2790.                                supported)
  2791.                    Bit 15   =reserved
  2792.               If function unsuccessful
  2793.                 Carry flag: set
  2794.                 AX=Error code (01h, 05h, or 06h)
  2795.  *Change Sharing Retry Count
  2796.    Call with: AX=440Bh
  2797.               CX=Delays per retry (default=1)
  2798.               DX=Number of retries (default=3)
  2799.    Returns  : If function successful
  2800.                 Carry flag: clear
  2801.               If function unsuccessful
  2802.                 Carry flag: set
  2803.                 AX=Error code (01h)
  2804.  *Check Input Status
  2805.    Call with: AX=4406h
  2806.               BX=Handle
  2807.    Returns  : If function successful
  2808.                 Carry flag: clear
  2809.               And for a device
  2810.                 AL=00h (if device not ready)
  2811.                   =FFh (if device ready)
  2812.               Or for a file
  2813.                 AL=00h (if file pointer at EOF)
  2814.                   =FFh (if file pointer not at EOF)
  2815.               If function unsuccessful
  2816.                 Carry flag: set
  2817.                 AX=Error code (01h, 05h, 06h,or 0Dh)
  2818.  *Check Output Status
  2819.    Call with: AX=4407h
  2820.               BX=Handle
  2821.    Returns  : If function successful
  2822.                 Carry flag: clear
  2823.               And for a device
  2824.                 AL=00h (if device not ready)
  2825.                   =FFh (if device ready)
  2826.               Or for a file
  2827.                 AL=FFh
  2828.               If function unsuccessful
  2829.                 Carry flag: set
  2830.                 AX=Error code (01h, 05h, 06h,or 0Dh)
  2831.  *Check if Block Device is Remote
  2832.    Call with: AX=4409h
  2833.               BX=Drive number (0=default, 1=A, 2=B,...)
  2834.    Returns  : If function successful
  2835.                 Carry flag: clear
  2836.                 DX=Device attribute word
  2837.                      Bit 12=0 (if drive is local)
  2838.                            =1 (if drive is remote)
  2839.               If function unsuccessful
  2840.                 Carry flag: set
  2841.                 AX=Error code (01h or 0Fh)
  2842.  *Check if Block Device is Removable
  2843.    Call with: AX=4408h
  2844.               BX=Drive number (0=default, 1=A, 2=B,...)
  2845.    Returns  : If function successful
  2846.                 Carry flag: clear
  2847.                 AL=00h (if medium is removable)
  2848.                   =01h (if medium is not removable)
  2849.               If function unsuccessful
  2850.                 Carry flag: set
  2851.                 AX=Error code (01h or 0Fh)
  2852.  *Check if Handle is Remote
  2853.    Call with: AX=440Ah
  2854.               BX=Handle
  2855.    Returns  : If function successful
  2856.                 Carry flag: clear
  2857.                 DX=Attribute word for file or device
  2858.                      Bit 15=0 (if local)
  2859.                            =1 (if remote)
  2860.               If function unsuccessful
  2861.                 Carry flag: set
  2862.                 AX=Error code (01h or 06h)
  2863.  *Generic I/O Control for Block Devices
  2864.    Call with: AX=440Dh
  2865.               BX=Drive code (0=default, 1=A, 2=B,...)
  2866.               CX=Minor function code...
  2867.                    0840h=Set Device Parameters
  2868.                    0841h=Write Track
  2869.                    0842h=Format and Verify Track
  2870.                    0846h=Set Media ID (4.0+)
  2871.                    0847h=Set Access Flag
  2872.                    0860h=Get Device Parameters
  2873.                    0861h=Read Track
  2874.                    0862h=Verify Track
  2875.                    0866h=Get Media ID (4.0+)
  2876.                    0867h=Get Access Flag
  2877.               DS:DX=segment:offset of parameter block
  2878.    Returns  : If function successful...
  2879.                 Carry flag: clear
  2880.               ...and if called with CL=60h or 61h
  2881.                 DS:DX=segment:offset of parameter block
  2882.               If function unsuccessful
  2883.                 Carry flag: set
  2884.                 AX=Error code (01h or 02h)
  2885.  *Generic I/O Control for Character Devices
  2886.    Call with: AX=440Ch
  2887.               BX=Handle
  2888.               CH=Category (major) code:
  2889.                    00=Unknown
  2890.                    01=COM1, COM2, COM3, or COM4
  2891.                    03=CON (keyboard and display)
  2892.                    05=LPT1, LPT2, or LPT3
  2893.               CL=Function (minor) code:
  2894.                    45h=Set Iteration Count
  2895.                    4AH=Select Code Page
  2896.                    4CH=Start Code Page Preparation
  2897.                    4DH=End Code Page Preparation
  2898.                    5Fh=Set Display Information [Version 4.0]
  2899.                    65h=Get Iteration Count
  2900.                    6AH=Query Selected Code Page
  2901.                    6BH=Query Prepare List
  2902.                    7Fh=Get Display Information [Version 4.0]
  2903.               DS:DX=segment:offset of parameter block
  2904.    Returns  : If function successful
  2905.                 Carry flag: clear
  2906.               And if called with CL=65h, 6Ah, or 6Bh
  2907.                 DS:DX=segment:offset of parameter block
  2908.               If function unsuccessful
  2909.                 Carry flag: set
  2910.                 AX=Error code (01h)
  2911.  *Get Logical Drive Map
  2912.    Call with: AX=440Eh
  2913.               BX=Drive code (0=default, 1=A, 2=B,...)
  2914.    Returns  : If function successful
  2915.                 Carry flag: clear
  2916.                 AL=Mapping code
  2917.                   =00h (if only one logical drive code assigned to
  2918.                      the block device) ...)
  2919.                   =01h-1Ah (logical drive code (1=A, 2=B,...)
  2920.                      mapped to the block device)
  2921.               If function unsuccessful
  2922.                 Carry flag: set
  2923.                 AX=Error code (01h or 05h)
  2924.  *Read Control Data from Block Device Driver
  2925.    Call with: AX=4404h
  2926.               BX=Drive code (0=default, 1=A, 2=B,...)
  2927.               CX=Number of bytes to read
  2928.               DS:DX=segment:offset of buffer
  2929.    Returns  : If function successful
  2930.                 Carry flag: clear
  2931.                 AX=Bytes transferred
  2932.               If function unsuccessful
  2933.                 Carry flag: set
  2934.                 AX=Error code (01h, 05h, 06h,or 0Dh)
  2935.  *Read Control Data from Character Device Driver
  2936.    Call with: AX=4402h
  2937.               BX=Handle
  2938.               CX=Number of bytes to read
  2939.               DS:DX=segment:offset of buffer
  2940.    Returns  : If function successful
  2941.                 Carry flag: clear
  2942.                 AX=Bytes read and
  2943.               If function unsuccessful
  2944.                 Carry flag: set
  2945.                 AX=Error code (01h, 05h, 06h, or 0Dh)
  2946.  *Set Device Information
  2947.               AX=4401h
  2948.               BX=Handle
  2949.               DX=Device information word
  2950.                    Bit 0    =1 (if console input)
  2951.                    Bit 1    =1 (if console output)
  2952.                    Bit 2    =1 (if NUL device)
  2953.                    Bit 3    =1 (if clock device)
  2954.                    Bit 4    =0 (reserved)
  2955.                    Bit 5    =0 (to select ASCII mode)
  2956.                             =1 (to select binary mode)
  2957.                    Bit 6    =0 (reserved)
  2958.                    Bit 7    =1 (indicating a device)
  2959.                    Bits 8-15=0 (reserved)
  2960.      Returns: If function successful Carry flag: clear
  2961.               If function unsuccessful
  2962.                 Carry flag: set
  2963.               AX=Error code (01h, 05h, or 06h)
  2964.  *Set Logical Drive Map
  2965.    Call with: AX=440Fh
  2966.               BX=Drive code (0=default, 1=A, 2=B,...)
  2967.    Returns  : If function successful
  2968.                 Carry flag: clear
  2969.                 AL=Mapping code
  2970.                   =00h (if only one logical drive code assigned
  2971.                      to the block device)
  2972.                   =01h-1Ah (logical drive code (1=A, 2=B,...)
  2973.                      mapped to the block device)
  2974.               If function unsuccessful
  2975.                 Carry flag: set
  2976.                 AX=Error code (01h or 05h)
  2977.  *Write Control Data to Block Device Driver
  2978.    Call with: AX=4405h
  2979.               BX=Drive code (0=default, 1=A, 2=B,...)
  2980.               CX=Number of bytes to write
  2981.               DS:DX=segment:offset of data
  2982.    Returns  : If function successful
  2983.                 Carry flag: clear
  2984.                 AX=Bytes transferred
  2985.               If function unsuccessful
  2986.                 Carry flag: set
  2987.                 AX=Error code (01h, 05h, 06h,or 0Dh)
  2988.  *Write Control Data to Character Device Driver
  2989.    Call with: AX=4403h
  2990.               BX=Handle
  2991.               CX=Number of bytes to write
  2992.               DS:DX=segment:offset of data
  2993.    Returns  : If function successful
  2994.                 Carry flag: clear
  2995.                 AX=Bytes transferred
  2996.               If function unsuccessful
  2997.                 Carry flag: set
  2998.                 AX=Error code (01h, 05h, 06h, or 0Dh)
  2999.  ----------------------------------------------------------------------
  3000.  Memory, Allocate block
  3001.    Call with: AX=4800h
  3002.               BX=Number of paragraphs of memory needed
  3003.    Returns  : If memory allocated
  3004.                 Carry flag=clear
  3005.                 AX=Initial segment of allocated block
  3006.               If not
  3007.                 Carry flag=set
  3008.                 AX=07h or 08h Error code
  3009.                 BX=Size of largest available block (paragraphs)
  3010.  ----------------------------------------------------------------------
  3011.  Memory, Release block
  3012.    Call with: AX=4900h
  3013.               ES=Segment of block to be released
  3014.    Returns  : If memory released Carry flag=clear
  3015.               If not
  3016.                 Carry flag=set
  3017.                 AX=07h or 09h Error code
  3018.  ----------------------------------------------------------------------
  3019.  Memory, Resize block
  3020.    Call with: AX=4A00h
  3021.               BX=Desired new block size in paragraphs
  3022.               ES=Segment of block to be modified
  3023.    Returns  : If memory resized Carry flag=clear
  3024.               If not
  3025.                 AX =07, 08h, or 09h Error code
  3026.                 BX=Maximum block size available (paragraphs)
  3027.  ----------------------------------------------------------------------
  3028.  Multiplex (Interrupt 2Fh)
  3029.    Call with: AH=01h Print Spooler
  3030.               AH=06h Resident ASSIGN command
  3031.               AH=10h Resident SHARE command
  3032.               AH=B7h Resident APPEND command
  3033.               AL=Function number
  3034.    Returns  : If on input AL was equal to 0, AL will equal 0FFh upon
  3035.               return. Otherwise it will depend on the handler
  3036.  ----------------------------------------------------------------------
  3037.  Printer Output
  3038.    Call with: AX=0500h
  3039.               DL=ASCII code for character
  3040.  ----------------------------------------------------------------------
  3041.  Redirect Handle
  3042.    Call with: AX=4600h
  3043.               BX=Handle for file or device
  3044.               CX=Handle to be redirected
  3045.    Returns  : If handle redirected Carry flag=clear
  3046.               If not AX=04h or 06h Error code
  3047.  ----------------------------------------------------------------------
  3048.  Set Data Transfer Area (DTA) Address
  3049.    Call with: AX=1A00h
  3050.               DS:DX=segment:offset of disk transfer area
  3051.  ----------------------------------------------------------------------
  3052.  Set Date
  3053.    Call with: AX=2B00h
  3054.               CX=Year (1980 through 2099)
  3055.               DH=Month (1 through 12)
  3056.               DL=Day (1 through 31)
  3057.    Returns  : If the date was set AL=00h
  3058.               If the date was not set AL=FFh
  3059.  ----------------------------------------------------------------------
  3060.  Set Extended Error Information
  3061.    Call with: Assumes previous call to function 5900h
  3062.               AX=5D0Ah
  3063.               DS:DX=segment:offset of structure
  3064.  ----------------------------------------------------------------------
  3065.  Set Interrupt Vector
  3066.    Call with: AH=25h
  3067.               AL=Interrupt number
  3068.               DS:DX=segment:offset of interrupt handling routine
  3069.  ----------------------------------------------------------------------
  3070.  Set Program Segment Prefix (PSP) Address
  3071.    Call with: AX=5000h
  3072.               BX=New PSP segment address
  3073.  ----------------------------------------------------------------------
  3074.  Set Time
  3075.    Call with: AX=2D00h
  3076.               CH=Hour (0 through 23)
  3077.               CL=Minute (0 through 59)
  3078.               DH=Second (0 through 59)
  3079.               DL=Hundredths of a second (0 through 99)
  3080.    Returns  : If the time was set AL=00h
  3081.               If the time was not set AL=FFh
  3082.  ----------------------------------------------------------------------
  3083.  Set Verify Flag
  3084.    Call with: AH=2E00h
  3085.  ----------------------------------------------------------------------
  3086.  Terminate Program:
  3087.    Call with: AX=0000h
  3088.               CS=Segment address of program segment prefix
  3089.  ----------------------------------------------------------------------
  3090.  Terminate Program with Return Code
  3091.    Call with: AH=4Ch
  3092.               AL=Return code
  3093.  ----------------------------------------------------------------------
  3094.  Terminate and Stay Resident
  3095.    Call with: AH=31h
  3096.               AL=Return code (0 through 255)
  3097.               DX=Number of paragraphs to reserve in memory
  3098. ╔═════════════════════════════════════════════════════════════════════╗
  3099. ║ List of DOS Extended Error Codes                                    ║
  3100. ╚═════════════════════════════════════════════════════════════════════╝
  3101.  Value...  Meaning...
  3102.  01h       Function number invalid
  3103.  02h       File not found
  3104.  03h       Path not found
  3105.  04h       Too many open files
  3106.  05h       Access denied
  3107.  06h       Handle invalid
  3108.  07h       Memory control blocks destroyed
  3109.  08h       Insufficient memory
  3110.  09h       Memory block address invalid
  3111.  0Ah       Environment invalid
  3112.  0Bh       Format invalid
  3113.  0Ch       Access code invalid
  3114.  0Dh       Data invalid
  3115.  0Eh       Unknown unit
  3116.  0Fh       Disk drive invalid
  3117.  10h       Attempted to remove current directory
  3118.  11h       Not same device
  3119.  12h       No more files
  3120.  13h       Disk write-protected
  3121.  14h       Unknown unit
  3122.  15h       Drive not ready
  3123.  16h       Unknown command
  3124.  17h       Data error (CRC)
  3125.  18h       Bad request structure length
  3126.  19h       Seek error
  3127.  1Ah       Unknown media type
  3128.  1Bh       Sector not found
  3129.  1Ch       Printer out of paper
  3130.  1Dh       Write fault
  3131.  1Eh       Read fault
  3132.  1Fh       General failure
  3133.  20h       Sharing violation
  3134.  21h       Lock violation
  3135.  22h       Disk change invalid
  3136.  23h       FCB unavailable
  3137.  24h       Sharing buffer exceeded
  3138.  25h       Code page mismatched
  3139.  26h       end of file operation not completed
  3140.  27h       Disk full
  3141.  28h-31h   Reserved
  3142.  32h       Unsupported network request
  3143.  33h       Remote machine not listening
  3144.  34h       Duplicate name on network
  3145.  35h       Network name not found
  3146.  36h       Network busy
  3147.  37h       Device no longer exists on network
  3148.  38h       Network command limit exceeded
  3149.  39h       Error in network adapter hardware
  3150.  3Ah       Incorrect response from network
  3151.  3Bh       Unexpected network error
  3152.  3Ch       Remote adapter incompatible
  3153.  3Dh       Print queue full
  3154.  3Eh       Not enough room for print file
  3155.  3Fh       Print file was deleted
  3156.  40h       Network name deleted
  3157.  41h       Network access denied
  3158.  42h       Incorrect network device type
  3159.  43h       Network name not found
  3160.  44h       Network name limit exceeded
  3161.  45h       Network session limit exceeded
  3162.  46h       Temporary pause
  3163.  47h       Network requested not accepted
  3164.  48h       Print or disk redirection paused
  3165.  49h-4Fh   Reserved
  3166.  50h       File already exists
  3167.  51h       Duplicate FCB
  3168.  52h       Cannot make directory
  3169.  53h       Fail on Int 24H (critical error)
  3170.  54h       Too many redirections
  3171.  55h       Duplicate redirection
  3172.  56h       Invalid password
  3173.  57h       Invalid parameter
  3174.  58h       Network write error
  3175.  59h       Function not supported by network
  3176.  5Ah       Required system component not installed
  3177.  65h       Device not selected
  3178. ╔═════════════════════════════════════════════════════════════════════╗
  3179. ║ Using the XYZ Critical Error Handler                                ║
  3180. ╚═════════════════════════════════════════════════════════════════════╝
  3181.  If you were to try and copy  a file from your hard disk to  a floppy,
  3182.  and there was no floppy disk in the drive bay, the copy program could
  3183.  not continue because it cannot copy  a file to an empty drive.   This
  3184.  would be  an example  of a  critical error.  Other examples would be:
  3185.    Attempting to write a file to a write-protected disk,
  3186.    A disk sector is unreadable,
  3187.    Attempting to read or write to an unformatted disk,
  3188.    The printer is out of paper, and so on.
  3189.  Anything listed  in the  section titled  "List of  DOS extended error
  3190.  codes" would  also be  a good  example.   Anyways, the  program would
  3191.  have to stop the current task  until something is done to enable  the
  3192.  task  to  be  continued.   Usually,  DOS  will print out the infamous
  3193.  "Abort,  Retry,  or  Fail?"  to  the  current  cursor location on the
  3194.  screen. If  you have  already gone  to great  lengths to  draw pretty
  3195.  screen graphics, then DOS will  write "Abort, Retry, or Fail?"  right
  3196.  in the  middle of  all of  it!   Wouldn't it  be better  if you could
  3197.  intercept DOS's improper attempt  at correcting a critical  error and
  3198.  replace it  with one  of your  own? You  can, with  the XYZ  critical
  3199.  error handler!  But how does it work?
  3200.  
  3201.  To enable  the XYZ  Critical Error  Handler, all  you need  to do  is
  3202.  include  one  label  in  your  coding.  That  label  should be called
  3203.  "CriticalError". Somewhere underneath that label, you must include  a
  3204.  "ret" command, since DOS is in an unstable state after responding  to
  3205.  a critical error and is waiting for a response from you as to what to
  3206.  do.
  3207.  
  3208.  When  a  critical  error  occurs,  the reserved argument "error" will
  3209.  contain one of the error codes listed in the section titled "List  of
  3210.  DOS extended error codes".  This code will give  you an idea of  what
  3211.  happened and  how you  might possibly  respond to  it. There  are two
  3212.  things to  remember when  responding to  a critical  error. One is to
  3213.  inform  the  user  of  the  error  and  how  to  possibly correct the
  3214.  situation, i.e. -- "There is no  disk in drive A:, please insert  the
  3215.  disk now. Press 'Enter'  when you are ready."  Two, you must use  the
  3216.  command "set error=" to inform the system of your decision of how  to
  3217.  handle the critical error. If error is set to...
  3218.  
  3219.    0...then the system will act like no error occurred and return 
  3220.        control to the program 
  3221.    1...then the system will keep retrying
  3222.    2...then the system will terminate the program
  3223.    3...then the system will act like error occurred but return 
  3224.       control to program anyways.
  3225.  
  3226.  If  you  respond  with  an  incorrect  decision  (i.e. -- the program
  3227.  cannot continue if the error is not corrected or if the error  cannot
  3228.  be corrected as in a divide by zero or dos internal error), then  the
  3229.  critical error  will keep  returning to  your critical  error handler
  3230.  until  the  situation  is  resolved  or  you terminate the program by
  3231.  setting error=2.
  3232.  
  3233.  For example:
  3234.  
  3235.    000 Example of Critical Error Handling
  3236.    dat txt 15 filename=a:\xyz.zip
  3237.    dat txt ErrorMessage=I can't read from drive a...
  3238.    set color=0A 00 00
  3239.    set start=1
  3240.    set size=28
  3241.    set mode=0
  3242.    file open filename
  3243.    jer Quit
  3244.    tty filename
  3245.    --- Quit
  3246.    file close handle
  3247.    end with 1
  3248.    --- CriticalError
  3249.    set color=0C 00 00
  3250.    set error=3 Informs system to act like an error occured
  3251.    tty ErrorMessage
  3252.    ret
  3253.    eof
  3254.  
  3255.  Now if the disk  is not present when  this program tries to  open the
  3256.  file on  drive a,  then the  program will  automatically jump  to the
  3257.  "CriticalError" section and  display the message  "I can't read  from
  3258.  drive  a..."  before  quitting.  Otherwise  this program will display
  3259.  "a:\xyz.zip" and quit.